(ПРИМЕЧАНИЕ: я использую iOS 9 и выполняю потоковую передачу по HTTP)
У меня есть AVPlayer, и я хочу для отображения индикатора загрузки во время буферизации плеера. Когда игрок начинает играть при медленном соединении, вызывается KVO для следующих свойств:
isPlaybackBufferEmpty
isPlaybackLikelyToKeepUp
isPlaybackBufferFull
Проблема в том, что эти же свойства не вызываются снова после завершения буферизации (когда я говорю «готово», я имею в виду, что видео можно воспроизводить снова) .) Моя цель — скрыть индикатор загрузки в нужное время, чтобы они больше не вызывались.
Я искал в Интернете и нашел этот радар: http:// www.openradar.me/25931165
Не уверен, что это на 100% связано
Есть мысли?
// MARK: - Key-Value Observing Method
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerItem.status) {
switch playerItem.status {
case .unknown:
break
case .readyToPlay:
player.play()
case .failed:
postPlaybackDidFailWithErrorNotification(error: error)
}
}
else if keyPath == #keyPath(AVPlayer.currentItem.isPlaybackBufferEmpty) {
guard let currentItem = player.currentItem else {
return
}
if currentItem.isPlaybackBufferEmpty {
print("isPlaybackBufferEmpty = YES")
} else {
print("isPlaybackBufferEmpty = NO")
}
}
else if keyPath == #keyPath(AVPlayer.currentItem.isPlaybackLikelyToKeepUp) {
guard let currentItem = player.currentItem else {
return
}
if currentItem.isPlaybackLikelyToKeepUp {
print("isPlaybackLikelyToKeepUp = YES")
//player.play()
} else {
print("isPlaybackLikelyToKeepUp = NO")
}
}
else if keyPath == #keyPath(AVPlayer.currentItem.isPlaybackBufferFull) {
guard let currentItem = player.currentItem else {
return
}
if currentItem.isPlaybackBufferFull {
print("isPlaybackBufferFull = YES")
//player.play()
} else {
print("isPlaybackBufferFull = NO")
}
}
else if keyPath == #keyPath(AVPlayer.currentItem) {
// Cleanup if needed.
if player.currentItem == nil {
video = nil
playerItem = nil
}
}
else if keyPath == #keyPath(AVPlayer.rate) {
updateMetadata()
NotificationCenter.default.post(name: AssetPlaybackManager.NotificationName.playerRateDidChangeNotification, object: nil)
}
else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}
Подробнее здесь: https://stackoverflow.com/questions/427 ... -buffering