在播放视频时,我看到来自AVPlayer
的费率更改通知似乎与应用活动无关。
当我的应用收到UIApplicationDidEnterBackgroundNotification
通知时,我会将AVPlayer
告诉pause
。逻辑是它应该返回到用户离开的同一个地方的前台。如果我在前往后台时没有拨打pause
,则不会出现问题。
发送给播放器的事件序列为pause
,seekToTime:
,play
。通常,这可以正常工作,但是,在将应用程序发送到后台然后返回到前台后,每次play
调用都会导致AVPlayer
的两次速率更改。第一个是1,第二个是紧跟着,只有该播放器实例正在使用时,每次调用-[AVPlayer play]
时,此模式会继续。
我可以在-[AVPlayer pause]
上设置一个断点,当速率变为0时,我看不到它被击中。如果我注释掉seekToTime:
电话,问题就会消失。如果我使用seekToTime:completionHandler:
,我也会遇到同样的问题,尽管我的阻止finished
参数是YES
。
除了“如何解决此问题”之外,我对如何检测与AVPlayer
/ {{1}无关的play
费率变化原因的任何详细信息感兴趣}}。 (在pause
上设置一个断点似乎永远不会触发。)
(一个几乎可行的解决方法是在进入背景时保存玩家位置,让它播放,并在返回前景时修复位置。这也需要一些音频级别的操作,这可能是可行的,但另一个问题是,并非所有背景通知都表明视图已被遮挡(例如,双击主页按钮)。这导致我的解决方法在应用程序被中断但仍然可见时显示分散注意力的运动图像的情况。)
建议?
(最后一点额外信息:在我试过的所有情况下,我最终进入一种状态,即AVPlayer在我调用'play'之后将速率从1改为0,如果我'我从后台返回然后进行了搜索。我可以做的事情是减少频率但没有消除它除了摆脱AVPlayer并创建一个新实例。这导致很长的延迟但是比一个更好完全失灵......我想。
我有一些证据表明搜索距离会影响结果,这表明错误可能在底层缓冲机制中。在不知道导致费率变化的原因(播放/暂停除外)的情况下,我看不到进一步调查的方法。)
答案 0 :(得分:3)
您可能正在获得AVPlayerItemPlaybackStalledNotification
。
试试这个:
[[NSNotificationCenter defaultCenter]
addObserverForName:AVPlayerItemPlaybackStalledNotification
object:cell.avPlayerItem
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
DDLogVerbose(@"%@", @"AVPlayerItemPlaybackStalledNotification");
}];
但是,Apple文档说Playback will continue once a sufficient amount of media has subsequently been delivered.
(https://developer.apple.com/library/iOS/documentation/AVFoundation/Reference/AVPlayerItem_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009532-CH1-SW83)
这对我或你来说都不会发生。
我仍在跟踪原因。
修改强>
这对我来说是个问题。当AVPlayerItem.likelyToKeepUp
为YES时,则不会发生。
不确定为什么它没有恢复。
修改强>
从Apple文档中可能会出现无法恢复播放的情况:
此属性传达可播放性的预测。因素 在该预测中考虑的包括I / O吞吐量和媒体解码 性能。 playbackLikelyToKeepUp可以指示NO 而属性playbackBufferFull表示YES。在这个事件中 播放缓冲区已达到容量,但没有统计数据 数据,以支持播放可能会跟上的预测 未来。
由您决定是否继续播放媒体。