gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:06:47 24 4
gpt4 key购买 nike

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

每当我将播放速率值设置为高于 1.0(例如 10.0)时,播放就会非常不稳定,并且看起来会丢失大量帧,因为玩家跟不上。

但是,QuickTime Player 中的相同值(播放同一部电影)可在 2x、5x、10x、30x 和 60x 速率下实现流畅播放(如 QuickTime Player 所报告)。

我创建了一个测试 OS X 应用程序,其中仅包含一个 AVPlayerView 和两个用于设置播放速率的按钮。 1.0 的速率可按预期工作,但 10.0 的速率会产生非常断断续续的播放。

但是,AVPlayerView 有一个奇怪的怪癖,即如果您在播放时间轴上单击鼠标以寻找另一个位置(当它以 10 倍速度播放且断断续续时),则 AVPlayerView 将“修复”播放,电影将以 10 倍流畅播放。只需点击播放时间线即可。

有谁知道如何以 1x 以外的速率实现流畅播放?这显然不是硬件问题或文件大小问题,因为 QuickTime Player 和 AVPlayerView 都可以做到。

尝试

这个question表明这可能是一个音频问题(事实上,QuickTime Player 和 AVPlayerView 在转发时都会将音频静音),但我所有尝试禁用所有音轨、静音所有轨道或更改音频音高算法的尝试似乎都没有解决问题。不同之处。即使没有音频,播放仍然断断续续。

我还尝试停止播放,然后使用新速率调用 prerollAtRate:completionHandler 但这也没有什么区别。

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

最佳答案

这只是一种解决方法。

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

关于macos - 如何从 AVPlayer 获得流畅的高速率播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30346405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com