我正在使用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
不是nil(loadedTimeRanges只有一个项目),其start
和duration
是不是0。
我应该检查什么?
我正在添加更多内容。
此症状仅在流式传输(m3u8)而非vod(mp4)时发生。
所以我猜这是缓冲数据的问题。当播放器正在播放时,缓冲区有数据可播放且数据仍然有效。在应用程序进入后台并返回前台后,播放器的缓冲区仍然包含isPlaybackLikelyToKeepUp == true
,AVPlayerItem.status == readyToPlay
的数据。但是当我尝试播放时,AVPlayer
会刷新缓冲区,因为它已经过时了。
看起来目前为止唯一的方法是创建新的AVPlayerItem
并在应用返回前景时进行设置。
我遇到的确切问题是什么,并想知道如何避免它。
这是我正在处理的回购。
https://github.com/trick14/SLPlayer
上面一个是现场,下面一个是VOD。加载完成后,播放并前往背景和前景几次。如果你尝试玩,所有状态看起来都很正常,但玩家会停滞不前。
答案 0 :(得分:0)
我很久以前也有类似的经历。 那时,当用户按下主页按钮时,我已经存储了播放状态和播放位置。 当返回前台时,我使用存储的信息来恢复或播放该位置。
我希望你能提供帮助。