检测 AVPlayer 中的视频停顿

Detecting video stalls in AVPlayer

我正在我的应用程序中使用 AVPlayer API 播放 HLS 流。我希望能够检测到由于网络带宽不足或连接质量低下而导致视频播放停止的情况。

有什么可靠的方法可以检测视频播放是否在屏幕上正常播放?

在我的测试过程中,我发现尽管视频播放实际上在屏幕上被冻结,但以下检查都报告了 OK 状态:

AVPlayer.status = .readyToPlay
AVPlayer.timeControlStatus = .playing
AVPlayerItem.status = .readyToPlay
AVPlayerItem.isPlaybackBufferEmpty = false
AVPlayerItem.isPlaybackLikelyToKeepUp  = true

+ 以及 addBoundaryTimeObserver 回调被触发。

其中一些最终会变成负数,但只是在延迟之后。

是否有任何 100% 可靠的方法来检测视频是否在设备上实际播放正常?

要确保媒体播放正常,请检查 AVPlayerItemrate

您还可以使用 AVPlayerItem 的通知来检测错误:

  • AVPlayerItemPlaybackStalled
  • AVPlayerItemFailedToPlayToEndTime
  • AVPlayerItemDidPlayToEndTime

请注意,AVPlayerItemDidPlayToEndTime 可以在缓冲区为空时触发 AND 网络中断。

你这里有一个例子:PlaybackObservingService