我正在使用AVPlayer构建音乐流媒体应用。 一切都很好,音乐在后台播放等等。 我的问题是,当我模拟手机上的连接丢失(关闭蜂窝数据,等待流停止然后切换回来)时,即使存在3G网络,应用程序也需要大约2分钟来填充缓冲区(I可以在网上冲浪)。
一切都在模拟器中工作,但不在设备上。 如果我等待2分钟,我会得到一个正确的回放类似ToKeepUp通知,从那以后一切都很好,但是重新缓冲应该只需几秒钟。当我通过关闭路由器上的带宽控制来模拟低带宽时,这是可以的,但当我通过关闭蜂窝数据来模拟载波更改并将其切换回那么长时间。
我在“playbackBufferEmpty”上调用beginInterruption,并在“playbackLikelyToKeepUp”上调用endInterruption。主要问题是“playbackLikelyToKeepUp”来得太晚了。
- (void)beginInterruption {
self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
}
- (void)endInterruptionWithFlags:(NSUInteger)flags {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
if(self.interrupted) [self play];
self.interrupted = NO;
}
有什么想法吗?我花了一整天的时间来处理这个问题,谷歌搜索了一切,但我被卡住了。 提前谢谢。
答案 0 :(得分:2)
几个月前我遇到了同样的情况,我的结论是“playbackLikelyToKeepUp不可靠”。
我的解决方案是手动检查缓冲的TimeRange。
仅供参考,我制作了一个用于远程媒体播放的AVPlayer课程 - HysteriaPlayer。 您可以直接使用它,也可以查找.m文件。
希望这有帮助。