首页 文章

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

提问于
浏览
8

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 将"fix"播放,电影将以10x平稳播放 . 只需单击播放时间线即可 .

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

Attempts

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

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

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

1 回答

  • 0

    这只是一种解决方法 .

    当播放速率从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
            }
        }
    }
    

相关问题