您应该为AVPlayerItemPlaybackStalledNotification添加观察者。
AVPlayerItemFailedToPlayToEndTimeNotification在这个问题上对我没有任何价值。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStalled:) name:AVPlayerItemPlaybackStalledNotification object:trackItem];
正如文档所说,如果必要的流媒体没有通过网络及时传递,则基于文件的播放不会继续。
通知的对象是 AVPlayerItem 实例,它的播放无法继续,因为必要的流媒体没有通过网络及时传递。一旦传送了足够数量的数据,流媒体的播放就会继续。基于文件的播放不会继续。
这解释了为什么 AVPlayer 可以在网络切换后恢复 HLS 流,但如果我使用 AVPlayer 播放基于文件的 TuneIn 资源则不能这样做。
那么答案就变得简单了。
- (void)playbackStalled:(NSNotification *)notification {
if ([self isFileBased:streamUri]) {
// Restart playback
NSURL *url = [NSURL URLWithString:streamUri];
AVPlayerItem *trackItem = [AVPlayerItem playerItemWithURL:url];
AVPlayer *mediaPlayer = [AVPlayer playerWithPlayerItem:trackItem];
[self registerObservers:trackItem player:mediaPlayer];
[mediaPlayer play];
}
}
进一步阅读有关automaticWaitsToMinimizeStalling 的讨论。