【发布时间】:2015-08-01 12:11:13
【问题描述】:
AVPlayer 有一个名为rate 的属性,用于控制播放速率。 1.0 是正常速度,而 2.0 或 5.0 等值应分别以 2x 和 5x 播放。
每当我将播放速率值设置为高于1.0(比如10.0)时,播放就会非常断断续续,并且由于播放器跟不上,看起来大量帧正在丢失。
但是,QuickTime Player 中的相同值(对于同一部电影)可以在 2x, 5x, 10x, 30x and 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 是如何实现以 10x、30x 甚至 60x 的速率流畅播放电影的?
【问题讨论】:
-
你找到解决这个问题的方法了吗?如果是,那是什么?
-
不,抱歉。我最终不得不构建自己的解决方案,但它并没有我想要的那么好。从长远来看,我认为最好的播放体验需要更深入地挖掘并在使用 AVPlayer 之外处理帧解码。
-
在 macos 10.12.3/Xcode 8.2.1 下,我已经确认了以上几点:速度高达 2.0 没有问题,但将
AVPlayer.rate设置为大于 2.0 的值会导致播放断断续续;使用 AVPlayerView 更改播放速率可实现所有速度的流畅播放;首先将速率设置为 0.0,然后调用prerollAtRate(atRate:, completionHandler:)并在完成处理程序中将速率设置为高并不能解决问题;仅使用视频轨道创建 AVMutableComposition 不能解决问题;禁用音轨并不能解决问题。 -
还可能值得注意的是,这显然是 AVFoundation 的一个黑暗角落,即使对于 Apple 的文档人员来说也是如此:AVSimplePlayerOSX 示例代码提供了一个快进按钮来显示此问题。
标签: macos cocoa avfoundation avplayer appkit