音视频倍速导出的技术方案

1,269 阅读4分钟

倍速的场景

我们经常在抖音中看到一些视频倍速播放,像幻灯片一样,播放非常快或者非常慢,这都是在剪辑视频的时候进行的速度的调节,就是倍速调节,这是一种很常见的视频处理方案。本文主要分析倍速导出是如何做的?

image.png

image.png 可以看看剪映中的变速方案,出了常规变速还有曲线变速。曲线变速是常规变速的变种,动态调整速度。


倍速的注意点

我们知道视频是由声音和视频序列画面组成的,如果想倍速处理视频,需要分别处理声音数据和视频序列画面,让他们都达到倍速的要求。处理视频序列画面很容易,例如原来的视频帧率是30fps,现在我需要调整为2倍速,那视频的帧率就变成15fps,原来1秒钟显示30帧画面的现在变成1秒钟显示15帧画面,但是声音的处理需要注意的地方比较多。

我们知道声音原始数据是一种波。它有几个相关的属性:

  • 音量
  • 音调
  • 音色

音频表示同等条件下,如果声音的振幅大,表示音量大,就是我们俗称的大嗓门。如下图:

WechatIMG184.jpeg

音调表示同等条件下,如果声音的频率高,表示音调高,就是我们俗称的声音尖,如下图:

WechatIMG185.jpeg

手绘的图片,大家将就看一下哈。

音色就是每个人或者物体的声音都有特定的属性,大家一听张三和李四说话的声音,即使看不到他们的脸,依然可以分辨出他们的声音,说明他们的音色是有明显的区别的。音色不在我们讨论的范围之内。


声音处理的倍速方案

我们在处理音频倍速的时候,需要保证变速的同时不能改变音调,如果变速的情况下改变音频,那整个声音听起来就非常怪,不是原来的声音了。

所以我们处理音频倍速需要保证以下的条件:

  • 声音保真
  • 变速不变调

目前比较成熟的方案有两种:

  • soundtouch
  • sonic

soundtouch介绍

soundtouch是一个开源的音频处理库,用于更改音频流或者音频文件的速度、音量、播放速率,可以用于处理视频文件或者播放视频时使用。

具体的开源项目地址是:soundtouch

soundtouch使用到的算法是WSOLA算法,WSAOLA就是Wave-form Similarity Overlap-Add 算法,实际上经过WSOLA算法处理,需要三个步骤:

  • 将音频按帧分解
  • 将分解好的帧重新定位
  • 合成最终的音频

完整的流程如下:

applsci-06-00057-g001-1024.webp 其中的分过程是将输入的音频进行分帧处理,然后进行音频叠加:添加的算法OLA如下:

applsci-06-00057-g003-1024.webp

但是叠加的过程中可能会存在两个问题:

(1)音频不连续

applsci-06-00057-g002-1024.webp

(2)直接叠加会造成音频叠加部分音频振幅改变

applsci-06-00057-g004-1024.webp

WSOLA算法在此基础上改进了叠加算法产生的问题,输入的音频分别成音频帧之后,不会直接叠加处理,而是再一定的范围内查找叠加的音频帧,该音频帧要符合与原位置处音频帧“波形最相似”的条件,符合该条件的音频帧作为输出帧进行输出视频的合成。“波形最相似”可以通过互相关系数来确定。

这儿我建议大家看下论文:《A Review of Time-Scale Modification of Music Signals》

sonic介绍

sonic是一款用于加快和减慢音频速度的开源软件,与soundtouch不同的时,sonic主要针对的对象是说话,就是sonic对普通的语音处理效果要好一点,soundtouch对音乐数据处理更加好一点。sonic基于PICOLA算法,主要是处理音频流,像ExoPlayer等开源软件都使用了sonic来处理音频。

sonic还有一个很好的优势,就是代码非常简介,直接就是基于CPU的浮点计算,一个文件。

GitHub - waywardgeek/sonic: Simple library to speed up or slow down speech

只需要引入sonic.c文件即可,不像soundtouch要引入的文件比较多。

我们VE中采用的是sonic,简单易上手。