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 【问题描述】:我正在使用AVPlayer
和AVPlayerItem
播放实时视频。我正在观察AVPlayerItem
的status
、isPlaybackLikelyToKeepUp
和AVPlayerItemPlaybackStalled
。我也在观察AVPlayer
的rate
。
我在测试时发现发生了非常奇怪的事情。
虽然AVPlayer
正常播放视频(AVPlayerItem.status == readyToPlay
和AVPlayerItem.isPlaybackLikelyToKeepUp == true
),但如果我按下主页按钮,AVPlayer.rate
将变为0.0
。这意味着播放器停止播放。
当应用程序回到前台并且我按下播放按钮时,它仍然是 AVPlayerItem.status == readyToPlay
和 AVPlayerItem.isPlaybackLikelyToKeepUp == true
但暂停了一段时间后开始播放。
我想知道播放器是暂停还是播放。在这种情况下,即使播放器没有播放视频,状态也表明它正在播放。 (AVPlayerItem.status == readyToPlay
, AVPlayerItem.isPlaybackLikelyToKeepUp == true
, AVPlayer.rate == 1.0
)
我检查了AVPlayerItem
的loadedTimeRanges
和item.loadedTimeRanges.first
不是零(loadedTimeRanges 只有一项),它的start
和duration
不是0。
我应该检查什么?
我再补充一点。
这种症状只发生在流式传输(m3u8) 上,而不是 vod(mp4) 上。
所以我猜这是缓冲数据的问题。在播放器播放时,缓冲区有数据要播放,并且数据仍然有效。在应用程序进入后台并返回前台后,玩家的缓冲区仍然有数据,所以isPlaybackLikelyToKeepUp == true
,AVPlayerItem.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 的 videoComposition 属性 (AVMutableVideoComposition)