QT 录音同时动态显示声音大小 及 一个噪音问题

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文件写入,存在很大噪音的原因

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

如下方式进行,
一个用QFile写入,一个用C文件操作写入
分别用QFile和C文件操作写入到目标文件中。

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

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

所选中行,发现用C直接写入,多了一个字节
其实根本原因是:要以二进制流的形式写,不然会自动把0x0A转换成0x0D 0x0A,导致数据错位

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值