0

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

一切都按预期工作,除非曲目播放完毕。那时会自动选择下一个曲目并更新 UI。但该曲目从未播放过。另外:playbackLikelyToKeepUp键值观察器没有被触发。我可以阅读该duration选定(未播放)AVPlayerItem 的...。所以它是一个有效的对象。

当我按“下一步”或在我的表格视图中选择一行时,一切都会正常工作。对我来说最奇怪的部分是用户事件(按“下一步”)和自动播放功能的代码完全相同。两者都currentTrackIndex在我的 PlaylistManager 上设置了一个,我观察它的变化。这会触发一个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];
}

我在想一些线程可能会阻止从 url 加载 mp3 时触发的事件?我看到 mp3 信息正在我的 http 流量工具中加载。

谢谢。

4

1 回答 1

0

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

  • 移动了我的共享音频播放器类内联
  • 为每个新选择的 AVPlayerItem 创建一个新的音频播放器
  • 当播放器到达终点时,使用一种更防错的方法来触发选择器:

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

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

于 2012-09-18T10:31:51.353 回答