QT 录音同时显示声音大小
日前要用Qt实现一个录音功能,同时要有声音大小的动态显示,以免录制的音频并不是正确的。官方的Demo有两种:
- 用
QAudioRecorder
类实现的 - 用
QAudioInput
类实现的
利用QAudioRecorder
类实现
用QAudioRecorder
实现的时候,可以显示声音大小的状态(利用QAudioProbe
作为探针,实现此功能,官方Demo中有)
同时将录制的音频进行存储,非常方便,但有一个问题就是:无法设置固定格式(至少我没有找到如何设置)
比如,我需要 16KHz 16bits/sample
的音频, 但它的"恒比特率模式"和"质量"模式,都无法满足我的要求。
利用QAudioInput
类实现
最后不得不采用QAudioInput
实现录音功能,利用QFile
进行写入。
QFile
类继承关系如下:
QFile --> QFileDevice --> QIODevice --> QObject
QIODevice
有虚函数writeData()
,在QFileDevice
对虚函数writeData()
进行了实现,QFile
的writeData()
方法继承于此。
有数据写入时最终都会调用方法writeData()
来完成,而如果重新实现这个虚函数,牵涉到Qt的私有类,私有类对用户是不开放的。(我也想重写writeData,但是没找到好方法)
最后采用的方案是 QIODevice
接受QAudioInput
采到的数据,然后在writeData()
中,找出当前音频的大小,并发出信号,动态显示出来。再在writeData()
中调用QFile
进行文件的写入。
用这种方法,实现了一个Recorder
类,可以完成音频的采集和声音大小的动态显示,并且可以更具需要设置音频格式。
代码已上传至资源中。
(ps. 总觉得不重写writeData()
有点,调用QIODevice
,再用QIODevice
调用QFile
有点效率低下。所以也可以通过文件操作直接在writeData()
中写入文件)
QAudioInput录音用C文件写入,存在很大噪音的原因
原因是写入过程中字节丢失
如下方式进行,
分别用QFile
和C文件操作写入到目标文件中。
结果一个正常,一个有巨大噪音
以16进制格式查看发现,噪音文件多了一个字节,导致错位。如果精度是8bits,应该就不会有这个问题。
其实根本原因是:要以二进制流的形式写,不然会自动把0x0A转换成0x0D 0x0A,导致数据错位
留作备忘,如有错误,希望大佬不吝留言指正,感谢!!!