ken*_*nyc 8 macos cocoa avfoundation appkit avplayer
AVPlayer
有一个叫做的属性rate
,用于控制播放速率.1.0
是正常速度,而值2.0
或5.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)
归档时间: |
|
查看次数: |
1534 次 |
最近记录: |