2016-04-13 4 views
4

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

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

Но мне нужно -1.0, а также скорость свыше 2.0.

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

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

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

ответ

2

возможности вы проверяете AVPlayerItem «s canPlayReverse или canPlayFastForward до AVPlayerItem» собственности status изменений s в .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") 
} 

Вместо наблюдать имущество, AVPlayerItem «s status. Ниже приведен список documentation от 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") 
    } 
Смежные вопросы