先看看效果:

之前我使用了QFile将音频存储为.raw格式,用matlab可以处理和播放,音质也不错,但是如果想采集后直接听是不行的,因为那个格式是自己定义的,播放器不认。现在使用QAudioRecorder可以保存为主流音频格式。但是在多线程中采集时还是遇到了一些奇怪的问题。

主要步骤很简单:

1. 初始化

mpProbe = new QAudioProbe;  //这里使用了一个探针,监听声音数据
    mpAudioRecorder = new QAudioRecorder();

connect(mpProbe, &QAudioProbe::audioBufferProbed,  // 把探针的信号与槽函数绑定
            this, &audioSample::processBuffer);

mpProbe->setSource(mpAudioRecorder);  // 指定声源
    settings.setCodec("audio/PCM");   // 这些是QAudioRecorder是设置,见名思意
    settings.setBitRate(96000);
    settings.setChannelCount(1);
    settings.setQuality(QMultimedia::EncodingQuality::HighQuality);
    settings.setEncodingMode(QMultimedia::ConstantQualityEncoding);

mpAudioRecorder->setContainerFormat("audio/wav");  // 设置容器格式

【2022.03.26更新】

这里说明一下,在QT5.9版本以前,使用上面的设置,在5.9版本以后,删掉:settings.setCodec("audio/PCM");  ,然后mpAudioRecorder->setContainerFormat("audio/x-wav");

2. 开启设备

settings.setSampleRate(mSampleRate);   //采样率在开启设备时确定
    mpAudioRecorder->setAudioInput(audioDeviceInfo.deviceName());//打开指定设备,还是用的QAudioDeviceInfo类,可以正常打开

settings.setQuality(QMultimedia::EncodingQuality::HighQuality);
    mpAudioRecorder->setOutputLocation(QUrl::fromLocalFile("./---test.avi"));   // 此时还没有录音,随便指定一个文件,仅仅为了探针能够接收到数据,实验发现无法保存到相对路径。

mpAudioRecorder->setEncodingSettings(settings);
    mpAudioRecorder->record(); //开始录音,这时候audioSample::processBuffer槽函数就可以被触发了,在这个槽函数中进行声音显示。

3. 开始录音

如果开始录音,把刚才的那个录音结束掉,然后重新设定保存文件,然后开启录音。

if ( mpAudioRecorder->state() == QMediaRecorder::RecordingState)
    {
        mpAudioRecorder->stop();
    }

mpAudioRecorder->setOutputLocation(QUrl::fromLocalFile(path));
    mpAudioRecorder->record();

4. 结束

if ( mpAudioRecorder->state() == QMediaRecorder::RecordingState)
    {
        mpAudioRecorder->stop();
    }

本来是很简单的,但是存在1个问题:

mpAudioRecorder->stop();   mpAudioRecorder->record();这两句话是不能连续执行的,否则第二段录音无法打开;解决的办法是等待10ms左右。但是等待尽量在主线程中等待,然后再通过信号-槽调用mpAudioRecorder->record()

中途还尝试过更换探针声源,mpProbe->setSource(mpAudioRecorder_copy); 这是不可行的,系统会提示在   子线程中不能开辟新线程,不知道为什么,可能是因为每一个探针是一个独立的线程吧。

最后为了实现监听和录音两不误,又创建了一个录音对象,一个对象给探针显示,一个对象用来录音,探针的录音对象可以设置为非常低的质量和采样率,不会影响录音的质量。

【2022.03.26更新】

另外,强调一下,QAudioRecorder类和QAudioInput类不能同时使用,否则后面打开的那个就无法找到设备,显示被占用。

目前我在台式机上分别用QAudioRecorder和QAudioInput类实现了连续的声音采集。在树莓派上,两种方式也均实现了声音连续采集,但是前者的压缩率不太好整,压缩效率不高,后者是使用了ffmepg库进行的压缩,效果不错但是无法实时获取采集到的声音数据。折腾了一圈,又使用QAudioRecorder+QAudioProbe的方案了。

Qt使用QAudioRecorder进行音频采集,以及声音、热红外和可见光数据采集软件效果相关推荐

  1. Linux系统 QT+Faac实时音频采集编码(QT音频采集篇)

    一:前言 刚毕业不久,接到的第一个项目就是音频采集. 要求在树莓派Linux系统上用QT进行音频采集,然后实时编码发送给window上的一个程序. 完成项目期间搜集了许多相关资料,苦于网上信息太过零散 ...

  2. QT学习篇(三):QT音频采集QAudioInput

    对于音频采集有很多的方式,在windows下存在API可以使用,例如wave:但是QT中有一个强大的音频处理的库,可以实现音频采集,设置采集的参数等.       这里便来记录下对这个库的使用---- ...

  3. Linux下Qt使用QAudio相关类进行音频采集,使用Windows下的Matlab软件播放

    Qt集成的QAudio相关类可以很方便的进行音频采集,主要涉及到以下几个类: #include <QAudioInput> #include <QAudioDeviceInfo> ...

  4. android下音频采集功能,音频采集:Android基于AudioRecord的实现

    前言 这篇文章简单详情下手机端Android系统下利使用AudioRecord进行音频采集方法. 开始前先提供一份源码 AudioRecordLib . AudioRecord采集的核心实现在于 Au ...

  5. Windows上的音频采集技术

    在制作发布端的时候,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音,对于音频处理的技术,主要有如下几种: 采集麦克风输入 采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处理 ...

  6. android 录音原始文件_音频采集:Android基于AudioRecord的实现

    前言 这篇文章简单介绍下移动端Android系统下利用AudioRecord进行音频采集方法. 按照惯例开始前先提供一份源码 AudioRecordLib . AudioRecord采集的核心实现在于 ...

  7. android触屏音文件地址,Android音视频-音频采集

    Android的音视频开发是我暂定的一个职业发展的一个方向,通过自学记录一些记了又忘记的知识. 音频基础知识 采样率(samplerate) 蓝色代表模拟音频信号,红色的点代表采样得到的量化数值. 采 ...

  8. voip 音频采集时间_树莓派3 音频配置及其应用场景(录音、VoIP 电话等)(锁定重发)...

    从网上看到一本关于树莓派的电子书 Raspberry Pi for Secret Agents,利用树莓派打造"特工装备". 其中有一章讲到音频设备的配置和几个相关的应用场景(比如 ...

  9. 使用STM32的DFSDM外设来驱动PDM麦克风进行音频采集

    0.前言 最近需要使用STM32L4系列来完成音频采集的工作,前前后后一共尝试了三种方案,最终在各种测试条件以及功耗等原因下,选择了目前这个方案. 主控使用的是STM32L475RCT6(无需一致,只 ...

最新文章

  1. 近期活动盘点:​年末必学课程《社会网络分析》
  2. C++/C的文件结构
  3. 腾讯面试题 Prometheus-PQL
  4. Java/Android引用类型及其使用分析
  5. Redis的3个高级数据结构
  6. 用c++库函数实现WCHAR写入文件
  7. 为什么技术人干得越久越拿不到高薪?
  8. java 异步 阻塞io_非阻塞IO与异步IO以及Java实现
  9. Linux定时函数介绍
  10. python之optparse模块
  11. 软考网络工程师备考经验
  12. 推荐10 个短小却超实用的 JavaScript 代码段
  13. thinkphp6如何部署在虚拟主机上?
  14. 计算机学院院徽设计,信息工程学院院徽设计
  15. Android API统计
  16. 代码报错 Uncaught TypeError: Converting circular structure to JSON
  17. Spring AOP拦截规则的两种定义方式
  18. 服务器遭到newinit.sh木马挖矿攻击记录
  19. 非极大抑制(Non-Maximum Suppression)
  20. Python 进阶(七): Word 基本操作

热门文章

  1. 自动驾驶感知-车道线系列(一)——车道线基础流程实现
  2. stl之set集合容器应用基础
  3. layui fixbar 返回顶部_卖在顶部(四)
  4. 计算机鼠标样式,告诉你电脑如何更改鼠标的指针样式?
  5. java 外观模式_Java设计模式11:外观模式
  6. python修改csv文件字段顺序_Pandas中DataFrame交换列顺序的方法实现
  7. 样本修改 sample_如何在R中使用sample()获取样本?
  8. Java 11:字符串类中的新方法
  9. struts2路径配置_Struts 2结果路径配置示例
  10. numpy矩阵乘法_NumPy矩阵乘法