1

我正在寻找一些解决方案,等待 SuperpoweredAdvancedAudioPlayer 打开文件。我制作了 ios objective-c 应用程序,我想同时播放多个曲目。但是当我尝试以这种方式开始曲目时:

    player1->open([[[NSBundle mainBundle] pathForResource:[[tracksNamesBigArray objectAtIndex:row] objectAtIndex:0]ofType:@"mp3"] fileSystemRepresentation]);
        player1->play(true);

    player2->open([[[NSBundle mainBundle] pathForResource:[[tracksNamesBigArray objectAtIndex:row] objectAtIndex:1] ofType:@"mp3"] fileSystemRepresentation]);
    player2->play(true);

    player3->open([[[NSBundle mainBundle] pathForResource:[[tracksNamesBigArray objectAtIndex:row] objectAtIndex:2] ofType:@"mp3"] fileSystemRepresentation]);
    player3->play(true);

    player4->open([[[NSBundle mainBundle] pathForResource:[[tracksNamesBigArray objectAtIndex:row] objectAtIndex:3] ofType:@"mp3"] fileSystemRepresentation]);
    player4->play(true);

或者当我将其包装在函数中并制作如下内容时:

  [self openPlayers:row]
  [self playAll];

它不会同时完美地开始播放,最后一首或 2 首曲目以 0.5s-.8s 延迟开始(在第一个示例中延迟大于秒)。如何等到打开成功再开始玩?我在超级强大的文档中没有找到任何功能。

4

2 回答 2

2

音频处理发生在音频处理回调中,音频堆栈在高优先级线程中定期调用该回调。

我猜你正在另一个线程中调用 play() 方法,也许是主线程。当您调用这些方法时,音频处理回调可能会在两者之间触发,从而延迟一个缓冲区大小。

解决方案是在音频处理回调开始时调用 play() 方法。

于 2016-12-02T17:20:50.880 回答
2

要检查 SuperpoweredAdvancedAudioPlayer 何时打开和加载文件,我必须在 playerEventCallback 中使用 SuperpoweredAdvancedPlayerEvent_LoadSuccess。然后玩家的同步开始要好得多。

这是我的新 playerEventCallback:

void playerEventCallback1(void *clientData, SuperpoweredAdvancedAudioPlayerEvent event, void *value) {
    RootViewController *self = (__bridge RootViewController *)clientData;
    switch(event){
        case SuperpoweredAdvancedAudioPlayerEvent_LoadSuccess:{
            RootViewController *self = (__bridge RootViewController *)clientData;
            NSLog(@"Player1 load success");
            self->loadIndicator++;
            break;
        }
        case SuperpoweredAdvancedAudioPlayerEvent_EOF:{
            self->player1->pause();
            self->player1->setPosition(0, true, false);
            break;} 
    }
}
于 2016-12-03T11:25:04.053 回答