-
Notifications
You must be signed in to change notification settings - Fork 163
变速播放的实现
变速播放的实现原理很简单。抛开音频回放暂不考虑,只有视频的情况下,变速播放就是改变了视频回放的播放帧率。如果帧率是 30fps,我们以 200% 的速度播放,那么等于是把帧率提升到了 60fps。帧率提升意味着,帧时间间距缩短,33.3ms 缩短为 16.6ms。因此如果要加速播放,就要求 cpu 有足够强大的解码能力,否则是没法做到的。而如果是减速播放,则可以减轻 cpu 的负担。
音频回放如何实现变速处理呢?原理就是音频重采样。举例说明,44100Hz 采样率的音频,每秒钟有 44100 个采样点,如果我们要加速为 200% 播放,怎么做到?最简单的方法,将解码出来的音频数据,均匀的扔掉一部分即可。解码出来 44100 个采样点,本来可以播放 1s 的时长,我扔掉一半,那么我们就只剩下 22050 个采样点,仍然按照 44100 的采样率去播放,那么我们就只能播放 0.5s 的时长,这样音频的播放速率就变为了 200%。用专业的数据讲,这个叫做音频的重采样滤波。
如果原始采样率为 44100Hz,播放速度为 speed,那么重采样的采样率计算公式为:
newsamprate = 44100 * 100.0 / speed;
我们以 newsamprate 的采样率对解码出来的原始音频进行重采样,然后仍然以固定的 44100Hz 的速率去回放音频,就实现了音频的变速播放。音频的重采样,我们借助 ffmpeg 的 libswresample 即可实现。除了改变视频帧率,和音频重采样,还需要处理的是变速播放后的音视频同步。
最直接的应用就是视频的慢放快放,另外还可用于保证播放的流畅性。低端设备上 cpu 处理能力弱,解码速度跟不上,我们在播放视频的时候,会明显感觉图像卡顿,声音不连续。这时如果我们能够降低播放速度,比如降速为 80% 播放,也许就能流畅的播放。之前 wince 上有一个名为 tcpmp 的播放器就是通过自动降速播放来达到流畅的播放体验的。变速播放还可用于做 cpu 性能测试,tcpmp 播放器就有这样的功能,通过加速播放视频,来测试 cpu 的解码能力,看最高能达到多快的加速播放速度。
fanplayer wiki