在自动播放时在AVQueuePlayer中播放AVPlayerItem

时间:2012-09-17 14:47:26

标签: iphone objective-c ios cocoa avqueueplayer

我有一个98%完成的应用程序,最近我偶然发现了一个新引入的错误。 该应用程序播放来自播放列表的服务器的mp3(只是跟踪网址的JSON列表,而不是m3u文件)。

除非赛道完成比赛,否则一切都按预期工作。 此时,自动选择下一曲目并更新UI。 但是赛道从未参加过。 另外:未触发playbackLikelyToKeepUp键值观察器。 我可以阅读所选(不播放)AVPlayerItem的duration,... 所以它是一个有效的对象。

当我按下“下一步”或在我的桌面视图中选择一行时,一切都有效。 对我来说最奇怪的部分是用户事件(按“下一步”)和自动播放功能的代码完全相同。两者都在我的播放列表管理器上设置了currentTrackIndex,我观察了它的变化。这会触发playCurrentTrack方法。

是否可能与NSNotificationCenter有关? 我用它来检查当前曲目是否已经完成播放,如下所示:

[[NSNotificationCenter defaultCenter]   addObserver:self
                                        selector:@selector(playerItemDidReachEnd:)
                                        name:AVPlayerItemDidPlayToEndTimeNotification
                                        object:self.currentAudioPlayerItem];

playerItemDidReachEnd看起来像这样:

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    // same action as pressing 'next' button in my audioplayer UI controls
    // which is working, I can also see some UI updates ( correct title etc. … )
    [self pressedNext];
}

我正在考虑使用线程,阻止从网址加载mp3时触发的事件?我看到我的http流量工具正在加载mp3信息。

感谢。

1 个答案:

答案 0 :(得分:0)

我(热门)通过将一些类方法重新内联来解决这个问题:

  • 将我的共享audioplayer类内联移动
  • 为每个新选择的AVPlayerItem创建一个新的audioplayer
  • 使用更多防错的方法在玩家到达时触发选择器:

    -(void)playerItemDidReachEndNotification{
    // make sure we trigger the selector on the main thread
    [self performSelectorOnMainThread:@selector(playerItemDidReachEnd) withObject:nil waitUntilDone:NO];
    }

我确信这些东西不是必需的,但主要目标是让它再次运作 希望在下一次迭代中找到真正的罪魁祸首。