2016-04-02 5 views
2

Я пытаюсь включить медленную скорость воспроизведения для видео, которое я играю, используя AVPlayerLayer. Для этого в документации указано, что она будет включать rate в диапазоне от 0,0 до 1,0, если AVPlayerItem возвращает true для canPlaySlowForward. Это свойство доступно только для чтения, поэтому для этого необходимо подклассу AVPlayerItem и переопределить это свойство. Я сделал это, но видео по-прежнему не играет медленными темпами, это всегда скорость 1.0. Он даже не называет свойство canPlaySlowForward. Почему это?Свойство canPlaySlowForward AVPlayerItem никогда не называлось

import AVFoundation 

class SlowMoPlayerItem: AVPlayerItem { 

    override var canPlaySlowForward: Bool { 
     return true 
    } 

} 

Воспроизведение видео:

let asset = AVAsset(URL: NSBundle.mainBundle().URLForResource("some-video", withExtension: "mp4")!) 
let playerItem = SlowMoPlayerItem(asset: asset) 
let player = AVPlayer(playerItem: playerItem) 
player.rate = 0.5 
player.muted = true 

let playerLayer = AVPlayerLayer(player: player) 
playerLayer.frame = self.view.layer.bounds 
self.view.layer.addSublayer(playerLayer) 
player.play() 

Единственное, что я связан с видео/аудио предотвратить его остановки фоновый звук через:

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 
} 

Видеофайл делает не включать звуковую дорожку, но это все еще необходимо включить.

ответ

3

Установить rate после звонка play(). Нет необходимости в подклассе AVPlayerItem.

func playVideo() { 
    let asset = AVAsset(URL: NSBundle.mainBundle().URLForResource("SampleVideo", withExtension: "mp4")!) 
    let playerItem = AVPlayerItem(asset: asset) 
    let player = AVPlayer(playerItem: playerItem) 
    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = self.view.bounds 
    self.view.layer.addSublayer(playerLayer) 
    player.play() 
    player.rate = 0.5 
}