AVPlayerItem 不播放视频,即使其状态为 `readyToPlay` 并且 `isPlaybackLikelyToKeepUp` 为 true

Posted

技术标签:

【中文标题】AVPlayerItem 不播放视频,即使其状态为 `readyToPlay` 并且 `isPlaybackLikelyToKeepUp` 为 true【英文标题】:AVPlayerItem doesn't play video even its status is `readyToPlay` and `isPlaybackLikelyToKeepUp` is true 【发布时间】:2016-10-31 23:32:22 【问题描述】:

我正在使用AVPlayerAVPlayerItem 播放实时视频。我正在观察AVPlayerItemstatusisPlaybackLikelyToKeepUpAVPlayerItemPlaybackStalled。我也在观察AVPlayerrate

我在测试时发现发生了非常奇怪的事情。

虽然AVPlayer 正常播放视频(AVPlayerItem.status == readyToPlayAVPlayerItem.isPlaybackLikelyToKeepUp == true),但如果我按下主页按钮,AVPlayer.rate 将变为0.0。这意味着播放器停止播放。

当应用程序回到前台并且我按下播放按钮时,它仍然是 AVPlayerItem.status == readyToPlayAVPlayerItem.isPlaybackLikelyToKeepUp == true 但暂停了一段时间后开始播放。

我想知道播放器是暂停还是播放。在这种情况下,即使播放器没有播放视频,状态也表明它正在播放。 (AVPlayerItem.status == readyToPlay, AVPlayerItem.isPlaybackLikelyToKeepUp == true, AVPlayer.rate == 1.0)

我检查了AVPlayerItemloadedTimeRangesitem.loadedTimeRanges.first 不是零(loadedTimeRanges 只有一项),它的startduration 不是0。

我应该检查什么?

我再补充一点。

这种症状只发生在流式传输(m3u8) 上,而不是 vod(mp4) 上。

所以我猜这是缓冲数据的问题。在播放器播放时,缓冲区有数据要播放,并且数据仍然有效。在应用程序进入后台并返回前台后,玩家的缓冲区仍然有数据,所以isPlaybackLikelyToKeepUp == trueAVPlayerItem.status == readyToPlay。但是,当我尝试播放时,AVPlayer 会刷新缓冲区,因为它是旧的。

目前看来唯一的方法是创建新的AVPlayerItem 并在应用返回前台时设置。

我遇到的确切问题是什么,想知道如何避免它。

这是我正在处理的 repo。

https://github.com/trick14/SLPlayer

上面是直播,下面是 VOD。加载完成后,播放并转到背景和前景几次。如果您尝试播放,所有状态看起来都正常,但播放器已停止。

【问题讨论】:

不喜欢视频的性质是什么(控制台中的任何错误或警告)?视频是什么文件格式?是本地(同一设备)还是远程? @AndreM 控制台中没有错误/警告。我在远程服务器中使用 m8u 和 mp4 进行了测试。 你能提供一个短代码sn-p吗?这是模拟器还是实际设备,如果是,是哪个设备? 我用模拟器(ios10/iPhone5s)和设备(iOS10.1.1/iPhone6s+)测试过。 你能展示一些代码或链接到重现问题的项目吗? 【参考方案1】:

我很久以前就有过类似的经历。 当时,我已经存储了用户按下主页按钮时的播放状态和播放位置。 返回前台时,我使用存储的信息来恢复或播放位置。

希望对你有所帮助。

【讨论】:

以上是关于AVPlayerItem 不播放视频,即使其状态为 `readyToPlay` 并且 `isPlaybackLikelyToKeepUp` 为 true的主要内容,如果未能解决你的问题,请参考以下文章

无法导出 AVPlayerItem

在播放期间更改 AVPlayerItem 的 videoComposition 属性 (AVMutableVideoComposition)

更换 AVPlayerItem 几秒钟后视频变黑

AVPlayer音频和视频播放

以秒为单位播放 AVPlayerItem CurrentTime 返回不一致的值

设置 AVPlayer AVPlayerItem 缓冲区大小?