2016-04-02 6 views
2

AVPlayerLayerを使用して再生しているビデオの再生速度を遅くしようとしています。これを行うにはAVPlayerItemがのcanPlaySlowForwardを返した場合にはrateが0.0〜1.0の範囲で有効になることがドキュメントに記載されています。このプロパティは読み取り専用なので、AVPlayerItemをサブクラス化し、このプロパティをオーバーライドしてこれを達成する必要があります。私はそれをやったが、ビデオはまだ低速で再生されていない、それは常に1.0レートです。それはcanPlaySlowForwardプロパティを呼び出すことさえありません。どうしてこれなの?ビデオの再生AVPlayerItemのcanPlaySlowForwardプロパティが呼び出されません

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

rateplay()にコールした後に設定します。 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 
}