playbackLikelyToKeepUp和AVPlayerItemStatusReadyToPlay有什么区别?

Mar*_*426 5 video-streaming ios avplayer

我试图了解如何正确检测播放器项目何时可以再次播放.

见下面的观察者逻辑:

if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
{
    if (playerItem.playbackBufferEmpty) 
    {
        // show loading indicator
    }
}

if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
    if (playerItem.playbackLikelyToKeepUp)
    {
        // hide loading indicator

        if (playerItem.status == AVPlayerItemStatusReadyToPlay) {
            // start playing
        }
        else if (playerItem.status == AVPlayerStatusFailed) {
            // handle failed
        }
        else if (playerItem.status == AVPlayerStatusUnknown) {
            // handle unknown
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正在检查AVPlayerItemStatusReadyToPlayplaybackLikelyToKeepUp矫枉过正?

要么

我应该只听取status播放器项目的更改而不是打扰playbackLikelyToKeepUp吗?

Mik*_*keG 5

这两个属性告诉我们有关AVPlayerItem状态的两条不同信息.AVPlayerItemStatusReadyToPlay是一个常量,readyToPlay只有在AVPlayer有足够的时间缓冲足够的项目数据以便它能够开始播放项目时才会指示.但就是这样.仅仅因为一件物品已准备就绪,并不意味着它在最初的几秒钟后就不会失速.

playBackLikelyToKeepUp返回bool指示项目的回放"可能"以在整个项目的持续时间内保持.此属性不仅适用于项目的开头,例如AVPlayerItemStatusReadyToPlay.它并不"关心"如果该项目已准备好播放,所有它"关心"的是否是它"认为"该项目的回放将保持不停止.这是可玩性的预测,考虑了您可以在这里阅读的各种因素 - > https://developer.apple.com/documentation/avfoundation/avplayeritemstatus

所以关于你的问题,AVPlayerItemStatusReadyToPlay在你检查过之后检查价值是否过分playbackLikelyToKeepUp......这取决于你.我个人会检查两者.我想首先确保该项目已准备好播放,这意味着已经缓冲了足够的数据AVPlayer以便开始播放.然后我想确保这一点,playbackLikeyToKeepUp == true以便我可以确定用户的媒体体验不会被打断.但是,如果您关心的是知道某个项目何时可以再次开始播放,那么您只需要检查status.