7

播放视频时,我看到AVPlayer似乎与应用活动无关的费率更改通知。

当我的应用收到UIApplicationDidEnterBackgroundNotification通知时,我告诉AVPlayerto pause。逻辑是它应该回到用户离开的同一个地方的前台。如果我在去后台时不调用pause,则不会出现问题。

发送给玩家的事件序列是pause, seekToTime:, play。通常,这可以正常工作,但是在应用程序被发送到后台然后返回到前台之后,每次play调用都会导致AVPlayer. -[AVPlayer play]第一个是 1,第二个是紧随其后的 0。只要该播放器实例在使用中,每次调用都会继续这种模式  。

我可以设置断点,-[AVPlayer pause]当速率变为 0 时,我看不到它被击中。如果我注释掉seekToTime:调用,问题就会消失。如果我使用seekToTime:completionHandler:,我也会遇到同样的问题,尽管我的块的finished参数是YES.

除了“我该如何解决这个问题”之外,我对有关如何检测与/AVPlayer无关的利率变化原因的任何细节感兴趣。(似乎永远不会触发断点。)playpause-[AVPlayer setRate:]

一种几乎可行的解决方法是在进入后台时保存播放器位置,让它播放,并在返回前台时固定位置。这也需要对音频电平进行一些操作,这可能是可行的,但另一个问题是并非所有背景通知都表明视图已被遮挡(例如,双击主页按钮)。这会导致我的解决方法在应用程序中断但仍可见时显示令人分心的移动图像。

建议?


最后一点额外信息:在我尝试过的所有情况下,如果我从后台返回并且然后进行了一次搜索。我可以做一些事情来降低它的频率,但除了摆脱 AVPlayer 并创建一个新实例之外,我可以做一些事情来消除它。这会导致很长的延迟,但比完全故障要好......我猜测。

我有一些证据表明寻道距离会影响结果,这表明错误可能出在底层缓冲机制中。在不知道导致速率变化的原因(播放/暂停除外)的情况下,我看不到进一步调查的方法。)

4

1 回答 1

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是,那么它就不会发生。

不知道为什么它没有恢复。


编辑:

在 Apple 文档中,存在无法恢复播放的情况:

该属性传达了对可玩性的预测。此预测中考虑的因素包括 I/O 吞吐量和媒体解码性能。当属性playbackBufferFull 指示YES 时,playbackLikelyToKeepUp 可能指示NO。在这种情况下,播放缓冲区已达到容量,但没有统计数据来支持未来可能会继续播放的预测。

是否继续播放媒体由您决定。

于 2013-11-25T13:53:59.593 回答