在播放视频时,我看到来自AVPlayer它的费率更改通知似乎与应用活动无关.
当我的应用程序收到UIApplicationDidEnterBackgroundNotification通知,我告诉AVPlayer来pause.逻辑是它应该返回到用户离开的同一个地方的前台.如果我pause在去往后台时没有打电话,则不会出现问题.
事件发送到玩家的顺序是pause,seekToTime:,play.通常,这可以正常工作,但是,在将应用程序发送到后台然后返回到前台后,每次play调用都会导致两次速率更改AVPlayer.第一个是1,紧接着是第二个是0.每个调用-[AVPlayer play]只要该播放器实例正在使用,该模式就会继续 .
我能够设置一个断点,-[AVPlayer pause]当速率变为0时我不会看到它被击中.如果我注释掉这个seekToTime:电话,问题就会消失.如果我使用seekToTime:completionHandler:,我也会遇到同样的问题,虽然我的块的finished参数是YES.
除了"我如何解决这个问题"之外,我对如何检测AVPlayer未与play/ 连接的速率变化原因的任何细节感兴趣pause.(断点-[AVPlayer setRate:]似乎永远不会触发.)
(几乎可行的一种解决方法是在进入背景时保存玩家位置,让它播放,并在返回前景时修复位置.这也需要对音频电平进行一些操作,这可能是可行的,但另一个问题是并非所有背景通知都表明视图已被遮挡(例如,双击主页按钮).这会导致我的解决方法在应用程序被中断但仍然可见时显示分散注意力的运动图像的情况.)
建议?
(最后一点额外的信息:在我试过的所有情况下,我最终进入一个状态,即如果我从后台返回并且在调用'play'之后AVPlayer将速率从1改为0.然后进行了一次搜索.我可以做些事情来降低它的频率,但除了摆脱AVPlayer并创建一个新实例之外没有任何消除它.这导致很长的延迟,但比完全故障更好......我猜测.
我有一些证据表明搜索距离会影响结果,这表明错误可能在底层缓冲机制中.在不知道导致费率变化的原因(除了播放/暂停)之外,我没有看到进一步调查的方法.)
您可能会得到一个AVPlayerItemPlaybackStalledNotification.
尝试这个:
[[NSNotificationCenter defaultCenter]
addObserverForName:AVPlayerItemPlaybackStalledNotification
object:cell.avPlayerItem
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
DDLogVerbose(@"%@", @"AVPlayerItemPlaybackStalledNotification");
}];
Run Code Online (Sandbox Code Playgroud)
然而,苹果文档说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是“是”时,它就不会发生。
不知道为什么没有恢复。
编辑:
根据 Apple 文档,有一种情况无法恢复播放:
该属性传达了对可玩性的预测。此预测中考虑的因素包括 I/O 吞吐量和媒体解码性能。playbackLikelyToKeepUp 可能指示“NO”,而属性playbackBufferFull 指示“YES”。在这种情况下,播放缓冲区已达到容量,但没有统计数据来支持未来播放可能保持的预测。
由您决定是否继续媒体播放。
| 归档时间: |
|
| 查看次数: |
4569 次 |
| 最近记录: |