QT 录音同时显示声音大小

日前要用Qt实现一个录音功能,同时要有声音大小的动态显示,以免录制的音频并不是正确的。官方的Demo有两种:

  1. QAudioRecorder类实现的
  2. QAudioInput类实现的

利用QAudioRecorder类实现

QAudioRecorder实现的时候,可以显示声音大小的状态(利用QAudioProbe作为探针,实现此功能,官方Demo中有)

同时将录制的音频进行存储,非常方便,但有一个问题就是:无法设置固定格式(至少我没有找到如何设置)

比如,我需要 16KHz 16bits/sample 的音频, 但它的"恒比特率模式"和"质量"模式,都无法满足我的要求。

利用QAudioInput类实现

最后不得不采用QAudioInput实现录音功能,利用QFile进行写入。

QFile类继承关系如下:
QFile --> QFileDevice --> QIODevice --> QObject

QIODevice有虚函数writeData(),在QFileDevice对虚函数writeData()进行了实现,QFilewriteData()方法继承于此。

有数据写入时最终都会调用方法writeData()来完成,而如果重新实现这个虚函数,牵涉到Qt的私有类,私有类对用户是不开放的。(我也想重写writeData,但是没找到好方法)

最后采用的方案是 QIODevice接受QAudioInput采到的数据,然后在writeData()中,找出当前音频的大小,并发出信号,动态显示出来。再在writeData()中调用QFile进行文件的写入。

用这种方法,实现了一个Recorder类,可以完成音频的采集和声音大小的动态显示,并且可以更具需要设置音频格式。

代码已上传至资源中。

(ps. 总觉得不重写writeData()有点,调用QIODevice,再用QIODevice调用QFile有点效率低下。所以也可以通过文件操作直接在writeData()中写入文件)

QAudioInput录音用C文件写入,存在很大噪音的原因

原因是写入过程中字节丢失

如下方式进行,

动态录音权限Androidstudio_虚函数


分别用QFile和C文件操作写入到目标文件中。

结果一个正常,一个有巨大噪音

以16进制格式查看发现,噪音文件多了一个字节,导致错位。如果精度是8bits,应该就不会有这个问题。

动态录音权限Androidstudio_虚函数_02


其实根本原因是:要以二进制流的形式写,不然会自动把0x0A转换成0x0D 0x0A,导致数据错位

留作备忘,如有错误,希望大佬不吝留言指正,感谢!!!