AVPlayerItem 的 canPlaySlowForward 属性 从未调用过

AVPlayerItem's canPlaySlowForward property never called

我正在尝试为正在使用 AVPlayerLayer 播放的视频启用慢速播放。为此,文档指出如果 AVPlayerItem returns truecanPlaySlowForward,它将在 0.0 - 1.0 范围内启用 rate。此 属性 是只读的,因此您需要继承 AVPlayerItem 并覆盖此 属性 以完成此操作。我已经这样做了,但视频仍然没有以较慢的速度播放,它始终是 1.0 的速度。它甚至从不调用 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()

我做的与 video/audio 相关的另一件事是防止它停止背景音频,通过:

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

视频文件不包含音轨,但这仍然是必要的。

调用play()后设置rate。无需子类 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
}