播放器中有个重要的功能就是倍速播放,比如现在有很多在线教育,或者看电影,据说现在的年轻人几乎都是1.2,1.5倍速的播放了,我个人是1.2和1.5倍速使用较多。

比如有的课程老师的语速比较慢,就调快点比较好。

因为我的播放器同步策略是是使用的视频去跟着音频播放,比如音频播放到了12s的位置,那么视频只能播放到12s的位置,音频播放速度快了,那么只要视频解码跟得上那么就播放快了。

最开始我想的是音频的采样率是44100,就是一秒钟采样了44100次,播放的时候也是1秒钟播放44100个sample就是1.0的正常速度,如果播放的时候是1秒播放44100 * 2,不就是两倍速?或者44100 / 2不就是0.5倍速,我实验了一波确实可以,但是声音变了,我擦,比如林志玲姐姐的声音就变成了郭德纲的声音了,或者郭德纲的声音就变成张靓颖的了,这肯定不行,要是小朋友听在线课程还不得打击学习积极性。

后面查询得知有两个库可以做到一个是soundtouch,一个是sonic,因为sonic直接是一个c文件,引入简单我就使用的这个。
音视频倍速播放之sonic-LMLPHP

它对应的api就这么多。

本质上就是音频解码后的pcm音频流直接放入sonic中处理,得到的新的pcm流,再拿来播放就可以了。

下面就简单说下倍速相关的使用

先创建一个sonicStream,把采样率和声道传递进去

tempoStream = sonicCreateStream(samplerate, channel);

然后初始化一些速度或者音调等(其实这就可以做一个tom猫那个小游戏软件了)

sonicSetSpeed(tempoStream, speed);
sonicSetPitch(tempoStream, 1.0);
sonicSetRate(tempoStream, 1.0);

好了这就可以处理pcm音频数据了,把pcm的具体数据放入进去,然后把sample的个数也传入进去。

sonicWriteShortToStream(tempoStream, buf, samples);

放进去后我们就可以取出来了,但是不是放进去多少个sample我们就要取出多少个sample,所以需要判断下,比如我们放入了1024个sample,我们取出来可能就只有998个sample,毕竟可能有丢弃sample的可能吧。

sonicSamplesAvailable(tempoStream)

好了我们就可以来读取了,返回的具体pcm数据放入samples中,maxSamples就是能返回的最大sample数,方法return的是真实得到的sample数

int sonicReadShortFromStream(sonicStream stream, short samples,int maxSamples)

好了,读取到的pcm直接放入android中的audioTrack,或者opensl es中播放就可以听到效果了。
我们在处理的过程中可以随时改变播放速度,或者音调等,都是可以的。

使用完最后一定要记得

sonicDestroyStream(tempoStream)
释放

对应使用方法在工程中的

sonicread.cpp

sonic.c 下载

下载链接

04-13 20:57