如何从AVPlayer获得流畅的高速播放?

ken*_*nyc 8 macos cocoa avfoundation appkit avplayer

AVPlayer有一个叫做的属性rate,用于控制播放速率.1.0是正常速度,而值2.05.0应分别以2x和5x回放.

每当我将播放速率值设置为高于1.0(比如说10.0)时,播放就会非常不稳定,并且看起来大量的帧会因为播放器无法跟上而丢失.

但是,QuickTime Player中的相同值(使用相同的电影)可以生成平滑的播放速率2x, 5x, 10x, 30x and 60x(由QuickTime播放器报告).

我创建了一个测试OS X应用程序,它只包含一个AVPlayerView和两个用于设置播放速率的按钮.1.0工作速度如预期的那样,但10.0产生的速度非常不稳定.

然而,AVPlayerView有一个奇怪的怪癖,如果你鼠标点击播放时间线寻找到另一个位置(当它以10x和波动的方式播放时),那么AVPlayerView将"修复"播放并且电影将以10x平稳播放.只需单击播放时间线即可.

有谁知道如何平稳播放1x以外的费率?这显然不是硬件问题或文件大小问题,因为QuickTime Player和AVPlayerView都可以做到这一点.

尝试

这个问题表明它可能是一个音频问题(事实上,QuickTime播放器和AVPlayerView在转发时都会使音频静音)但是我所有试图禁用所有音轨,静音所有音轨或改变音频音调算法的尝试似乎都没有做出改变.即使没有音频,播放仍然不稳定.

我也试过停止播放然后prerollAtRate:completionHandler用新的速率呼叫,但这也没有什么区别.

QuickTime Player和AVPlayerView正在做什么,可以以10倍,30倍甚至60倍的速度播放流畅的电影?

小智 2

这只是一个解决方法。

当播放速率从 0.0 更改为较大值时,如果这是自上次调用 以来播放速率第一次从零到非零转换AVPlayer.replaceCurrentItem,则播放会很流畅(并且音频会自动静音)。这是第一次这样的转换:仅仅先将速率设置为 0.0,然后再设置为所需的速率是行不通的。

因此,例如,这将产生高速流畅的播放:

func setPlayerRate(player: AVPlayer, rate: Float) {
    // AVFoundation wants us to do most things on the main queue.
    DispatchQueue.main.async {
        if (rate == player.rate) {
            return
        }
        if (rate > 2.0 || rate < -2.0) {
            let playerItem = player.currentItem
            player.replaceCurrentItem(with: nil)
            player.replaceCurrentItem(with: playerItem)
            player.rate = rate
        } else {
            // No problems "out of the box" with rates in the range [-2.0,2.0].
            player.rate = rate
        }
    }
}
Run Code Online (Sandbox Code Playgroud)