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,导致数据错位
留作备忘,如有错误,希望大佬不吝留言指正,感谢!!!
💡 关键要点
QT 录音同时显示声音大小 日前要用Qt实现一个录音功能,同时要有声音大小的动态显示,以免录制的音频并不是正确的。官方的Demo有两种: 用QA