Почему метод canPlayFastForward AVPlayerItem возвращает False?

Я действительно хочу реализовать быструю перемотку вперед и назад с помощью AVFoundation.

Насколько я знаю, я могу играть только 0.0 ~ 2.0 с AVPlayer, если AVPlayerItem's canPlayReverse и canPlayFastForward возвращает False.

Но мне нужно -1,0, а также более 2,0.

Моя проблема в том, что я просто не могу найти, когда и почему результаты ложны.

Нет никакого упоминания о том, когда canPlayFastForward возвращает false в документе Apple.

Может ли кто-нибудь объяснить, когда и почему результаты canPlayFastForward & canPlayReverse являются ложными и как я могу изменить его на true ?

Возможно, вы проверяете canPlayReverse или canPlayFastForward AVPlayerItem до того, как status свойства AVPlayerItem изменится на .readToPlay . Если вы это делаете, вы всегда будете false .

Не делайте так:

 import AVFoundation let anAsset = AVAsset(URL: <#A URL#>) let playerItem = AVPlayerItem(asset: anAsset) let canPlayFastForward = playerItem.canPlayFastForward if (canPlayFastForward){ print("This line won't execute") } 

Вместо этого соблюдайте status свойства AVPlayerItem . Ниже приведена документация от Apple:

Объекты AVPlayerItem являются динамическими. Значение AVPlayerItem.canPlayFastForward изменится на YES для всех файловых активов и некоторых потоковых активов (если исходный список воспроизведения предлагает носители, которые его разрешают) в момент готовности элемента к воспроизведению. Способ получения уведомления, когда элемент игрока готов к воспроизведению, – это наблюдать свойство AVPlayerItem.status через наблюдение за ключевыми значениями (KVO).

 import AVFoundation dynamic var songItem:AVPlayerItem! //Make it instance variable let anAsset = AVAsset(URL: <#A URL#>) let songItem = AVPlayerItem(asset: anAsset) playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil) 

Ovveride метод observeValue в том же классе:

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let status = change?[.newKey] as? Int{ if(status == AVPlayerItemStatus.readyToPlay.rawValue){ yourPlayer.rate = 2.0 // or whatever you want } } } 

Не забудьте удалить этот класс из наблюдателя статуса songItem

 deinit { playerItem.removeObserver(self, forKeyPath: "status") } 
Interesting Posts
Давайте будем гением компьютера.