Qt使用QAudioRecorder进行音频采集,以及声音、热红外和可见光数据采集软件效果
先看看效果:
之前我使用了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进行音频采集,以及声音、热红外和可见光数据采集软件效果相关推荐
- Linux系统 QT+Faac实时音频采集编码(QT音频采集篇)
一:前言 刚毕业不久,接到的第一个项目就是音频采集. 要求在树莓派Linux系统上用QT进行音频采集,然后实时编码发送给window上的一个程序. 完成项目期间搜集了许多相关资料,苦于网上信息太过零散 ...
- QT学习篇(三):QT音频采集QAudioInput
对于音频采集有很多的方式,在windows下存在API可以使用,例如wave:但是QT中有一个强大的音频处理的库,可以实现音频采集,设置采集的参数等. 这里便来记录下对这个库的使用---- ...
- Linux下Qt使用QAudio相关类进行音频采集,使用Windows下的Matlab软件播放
Qt集成的QAudio相关类可以很方便的进行音频采集,主要涉及到以下几个类: #include <QAudioInput> #include <QAudioDeviceInfo> ...
- android下音频采集功能,音频采集:Android基于AudioRecord的实现
前言 这篇文章简单详情下手机端Android系统下利使用AudioRecord进行音频采集方法. 开始前先提供一份源码 AudioRecordLib . AudioRecord采集的核心实现在于 Au ...
- Windows上的音频采集技术
在制作发布端的时候,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音,对于音频处理的技术,主要有如下几种: 采集麦克风输入 采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处理 ...
- android 录音原始文件_音频采集:Android基于AudioRecord的实现
前言 这篇文章简单介绍下移动端Android系统下利用AudioRecord进行音频采集方法. 按照惯例开始前先提供一份源码 AudioRecordLib . AudioRecord采集的核心实现在于 ...
- android触屏音文件地址,Android音视频-音频采集
Android的音视频开发是我暂定的一个职业发展的一个方向,通过自学记录一些记了又忘记的知识. 音频基础知识 采样率(samplerate) 蓝色代表模拟音频信号,红色的点代表采样得到的量化数值. 采 ...
- voip 音频采集时间_树莓派3 音频配置及其应用场景(录音、VoIP 电话等)(锁定重发)...
从网上看到一本关于树莓派的电子书 Raspberry Pi for Secret Agents,利用树莓派打造"特工装备". 其中有一章讲到音频设备的配置和几个相关的应用场景(比如 ...
- 使用STM32的DFSDM外设来驱动PDM麦克风进行音频采集
0.前言 最近需要使用STM32L4系列来完成音频采集的工作,前前后后一共尝试了三种方案,最终在各种测试条件以及功耗等原因下,选择了目前这个方案. 主控使用的是STM32L475RCT6(无需一致,只 ...
最新文章
- 近期活动盘点:​年末必学课程《社会网络分析》
- C++/C的文件结构
- 腾讯面试题 Prometheus-PQL
- Java/Android引用类型及其使用分析
- Redis的3个高级数据结构
- 用c++库函数实现WCHAR写入文件
- 为什么技术人干得越久越拿不到高薪?
- java 异步 阻塞io_非阻塞IO与异步IO以及Java实现
- Linux定时函数介绍
- python之optparse模块
- 软考网络工程师备考经验
- 推荐10 个短小却超实用的 JavaScript 代码段
- thinkphp6如何部署在虚拟主机上?
- 计算机学院院徽设计,信息工程学院院徽设计
- Android API统计
- 代码报错 Uncaught TypeError: Converting circular structure to JSON
- Spring AOP拦截规则的两种定义方式
- 服务器遭到newinit.sh木马挖矿攻击记录
- 非极大抑制(Non-Maximum Suppression)
- Python 进阶(七): Word 基本操作
热门文章
- 自动驾驶感知-车道线系列(一)——车道线基础流程实现
- stl之set集合容器应用基础
- layui fixbar 返回顶部_卖在顶部(四)
- 计算机鼠标样式,告诉你电脑如何更改鼠标的指针样式?
- java 外观模式_Java设计模式11:外观模式
- python修改csv文件字段顺序_Pandas中DataFrame交换列顺序的方法实现
- 样本修改 sample_如何在R中使用sample()获取样本?
- Java 11:字符串类中的新方法
- struts2路径配置_Struts 2结果路径配置示例
- numpy矩阵乘法_NumPy矩阵乘法