标题:Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用
作者:liudianwu
日期:2024-02-03 09:27
内容:
## 一、前言
之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput的采样率,可以规避这个问题,破音不在出现了,但是音调变了,倍速越大变得越快,人声越发不清晰,变得尖锐,也就是通常说的变速变调了。当然这是正常现象,所有搞音视频播放开发者都会遇到这个现象,因为这就是默认的正常现象,但是我们希望听到的是变速不变调,速度可以快,但是要尽量保持人声能够识别。所以就需要有个算法能够将收到的可以直接播放的pcm数据运算,运算后的pcm数据是尽量保证了人声的数据,这样保持采样率不变的情况下,播放出来的声音效果非常好。
对比过很多播放器,有些著名的播放器早期也是没有考虑到这个变速变调的问题,是后来的版本才慢慢加上去的。还有些著名的组件比如qtav等,也一直是没有解决变速变调的问题,包括著名的推流大佬obs,调整到2倍速推流,声音也是变调了的。通过查阅资料得知,保证变速不变调,通常用两个库来实现,一个是soundtouch,一个是sonic,本人更喜欢用sonic,集成简单,就一个h和一个c文件,纯c语言编写的,整个源码就几千行代码。要学习也是非常容易的,通用任何平台和编译器。毕竟就是个数学运算库,只要是能支持C语言的场景就都支持。
Qt调用sonic库基本步骤:
- 创建对象 sonicCreateStream,传入采样率和通道。
- 设置倍速 sonicSetSpeed,还可以设置音调sonicSetPitch、设置语速sonicSetRate等。
- 写入数据 sonicWriteShortToStream,将收到的可以直接播放的pcm音频数据传入。
- 取出数据 sonicReadShortFromStream,将取出的数据再发给qaudiooutput播放即可。
视频演示步骤:
1. 演示不做任何处理的倍速声音。
2. 演示通过更改采样率的倍速声音。
3. 演示通过音效库处理的声音。
4. 演示音调变化,正常语速,变化音调。
5. 演示音量变化,正常音量,通过修改声音数据,强制提高音量。
6. 演示麦克风正常语速变调,不同通道。
7. 对比vlc、mpv、qtav的倍速处理。
8. 在其他系统上编译测试是否也都兼容。
## 二、效果图
## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品: ..
#1 [shokokawaii 02-13 11:57]