我正在尝试了解如何正确检测播放器项目何时可以再次播放。
参见下面的观察者逻辑:
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
}
}
}
是否在
AVPlayerItemStatusReadyToPlay
下方检查playbackLikelyToKeepUp
过度杀伤?要么
我应该只听播放器项目上
status
的更改,而不是为playbackLikelyToKeepUp
烦恼吗? 最佳答案
这两个属性向我们通知有关AVPlayerItem状态的两条不同的信息。 AVPlayerItemStatusReadyToPlay
是一个常数,仅当AVPlayer被赋予足够的时间来缓冲足够的项目数据,从而能够开始播放项目时,才会指示readyToPlay
。就是这样。仅仅因为一项物品已经准备好播放,并不意味着它在开始的几秒钟内不会停顿。
playBackLikelyToKeepUp
返回bool
,指示该项目的播放在整个项目持续时间内“可能”保持同步。此属性不仅与项的开头有关,例如AVPlayerItemStatusReadyToPlay
。它不“关心”该项目是否已准备好播放,它“关心”的只是是否“认为”该项目的播放将保持下去而不会停顿。这是可玩性的预测,其中考虑了您可以在此处阅读的各种因素-> https://developer.apple.com/documentation/avfoundation/avplayeritemstatus
因此,关于您的问题,在检查完AVPlayerItemStatusReadyToPlay
后检查playbackLikelyToKeepUp
的值是否为时过早……完全取决于您。我个人会检查两者。我想先确保该项目已准备好播放,这意味着AVPlayer
已缓冲了足够的数据以便开始播放。然后,我想确保使用playbackLikeyToKeepUp == true
,以便可以一定程度确定用户的媒体体验不会受到干扰。但是,如果您所关心的只是知道什么时候可以开始重新播放,那么您只需要检查status
即可。