Qt音频采集:QAudioInput详解与示例

1. 简介

QAudioInput是Qt Multimedia模块中用于音频采集的核心类,能够从麦克风等输入设备实时获取原始音频数据(PCM格式)。本文将通过原理讲解和代码示例,帮助开发者快速掌握音频采集的核心技术。


2. 核心功能

  • 支持多种音频格式(采样率/声道/位深)

  • 提供实时音频流访问

  • 自动管理音频设备资源

  • 支持多平台(Windows/Linux/macOS/移动端)


3. 开发准备

3.1 环境要求

# .pro文件添加
QT += multimedia

3.2 头文件

#include <QAudioInput>
#include <QAudioDeviceInfo>

4. 核心类说明

4.1 QAudioInput

  • 核心方法

    • start(): 开始采集

    • stop(): 停止采集

    • setBufferSize(): 设置缓冲区大小

4.2 QAudioFormat

  • 常用配置

    format.setSampleRate(16000);      // 16kHz采样率
    format.setChannelCount(1);        // 单声道
    format.setSampleSize(16);         // 16位采样
    format.setCodec("audio/pcm");     // PCM编码
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::SignedInt);

5. 基础使用流程

5.1 初始化设备

// 创建音频格式
QAudioFormat format;
// ...(设置格式参数)// 获取输入设备
QAudioDeviceInfo inputDevice = QAudioDeviceInfo::defaultInputDevice();
if (!inputDevice.isFormatSupported(format)) {format = inputDevice.nearestFormat(format);
}// 创建音频输入对象
QAudioInput* audioInput = new QAudioInput(inputDevice, format, this);

5.2 数据采集与保存

// 创建文件保存原始数据
QFile outputFile("raw.pcm");
outputFile.open(QIODevice::WriteOnly);// 开始采集
audioInput->start(&outputFile);

6. 完整示例代码

示例1:保存为WAV文件(含文件头)

#include <QCoreApplication>
#include <QAudioInput>
#include <QFile>
#include <QDataStream>// WAV文件头结构(44字节)
struct WavHeader {// ...(完整文件头结构定义,此处省略)
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 配置音频格式QAudioFormat format;format.setSampleRate(16000);format.setChannelCount(1);format.setSampleSize(16);format.setCodec("audio/pcm");format.setByteOrder(QAudioFormat::LittleEndian);format.setSampleType(QAudioFormat::SignedInt);// 初始化设备QAudioInput audioInput(QAudioDeviceInfo::defaultInputDevice(), format);// 创建WAV文件QFile file("recording.wav");file.open(QIODevice::WriteOnly);// 写入空文件头WavHeader header = createWavHeader(format);file.write((const char*)&header, sizeof(header));// 开始录音audioInput.start(&file);// 录音5秒后停止QTimer::singleShot(5000, [&]() {audioInput.stop();file.close();qApp->quit();});return a.exec();
}

示例2:实时音量监测

class AudioMonitor : public QIODevice {
public:explicit AudioMonitor(QObject* parent = nullptr) : QIODevice(parent) {}protected:qint64 readData(char*, qint64) override { return 0; } // 不需要实现qint64 writeData(const char* data, qint64 len) override {// 计算音量(16位样本)const qint16* samples = reinterpret_cast<const qint16*>(data);int sampleCount = len / 2; // 每个样本占2字节qreal peak = 0;for (int i=0; i<sampleCount; ++i) {peak = qMax(peak, qAbs(samples[i]/32768.0));}emit volumeChanged(peak * 100); // 百分比return len;}signals:void volumeChanged(qreal percent);
};// 使用方式:
AudioMonitor* monitor = new AudioMonitor;
audioInput->start(monitor);
QObject::connect(monitor, &AudioMonitor::volumeChanged, [](qreal vol){qDebug() << "当前音量:" << vol << "%";
});

7. 常见问题解决方案

7.1 无输入数据

  • 检查项

    1. 系统麦克风权限

    2. 音频格式与设备兼容性

    3. 缓冲区大小设置(setBufferSize(2048)

7.2 录音文件杂音

  • 解决方法

    • 添加静音检测逻辑

    • 使用噪声抑制算法

    • 调整麦克风增益

7.3 延迟过高

  • 优化方法

    audioInput->setBufferSize(512);  // 减小缓冲区
    QThread::highPriority();         // 提升线程优先级

8. 关键知识点总结

要点说明
格式匹配必须与硬件支持格式一致
实时性处理避免在回调中进行耗时操作
资源释放stop()后及时释放设备
跨平台差异特别注意移动端权限问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载安装Node.js及其他环境

提示&#xff1a;从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm&#xff08;我需要安装&#xff09;安装脚手架安装依赖安装淘宝镜像&#xff08;注意会更新&#xff09;cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…

【后端】ORM / ODM

长期不定期更新&#xff0c;建议关注收藏点赞。 概述 ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;&#xff1a;面向关系型数据库&#xff0c;ORM将对象映射到数据库的表和行&#xff08;例如MySQL、PostgreSQL&#xff09;。ODM&#xff0…

无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?

近三年&#xff0c;全球超过58%的网站采用无限滚动设计&#xff08;数据来源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方数据显示&#xff0c;动态加载内容的索引失败率高达73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用纯无限滚动的页…

手写JSX实现虚拟DOM

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

注&#xff1a;本文为 “网路性能优化” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 TCP_NODELAY 详解 lenky0401 发表于 2012-08-25 16:40 在网络拥塞控制领域&#xff0c;Nagle 算法&#xff08;Nagle algorithm&#xff09;是一个非常著名的算法&…

玄机-应急响应-webshell查杀

题目要求&#xff1a; 要求获取四个flag webshell查杀&#xff1a; 常见的webshell&#xff1a; PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…

docker存储卷及dockers容器源码部署httpd

1. COW机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件…

PyTorch中卷积层torch.nn.Conv2d

在 PyTorch 中&#xff0c;卷积层主要由 torch.nn.Conv1d、torch.nn.Conv2d 和 torch.nn.Conv3d 实现&#xff0c;分别对应一维、二维和三维卷积操作。以下是详细说明&#xff1a; 1. 二维卷积 (Conv2d) - 最常用 import torch.nn as nn# 基本参数 conv nn.Conv2d(in_channe…

从 ZStack 获取物理机与云主机信息并导出 Excel 文件

文章目录 从 ZStack 获取物理机与云主机信息并导出 Excel 文件环境zstack 官网客户端封装讲解 获取物理机信息讲解 获取云主机信息并关联物理机讲解 导出数据到 Excel 文件讲解 运行主程序讲解 总结最终文档效果完整代码 从 ZStack 获取物理机与云主机信息并导出 Excel 文件 在…

5.好事多磨 -- TCP网络连接Ⅱ

前言 第4章节通过回声服务示例讲解了TCP服务器端/客户端的实现方法。但这仅是从编程角度的学习&#xff0c;我们尚未详细讨论TCP的工作原理。因此&#xff0c;将详细讲解TCP中必要的理论知识&#xff0c;还将给出第4章节客户端问题的解决方案。 一、回声客户端完美实现 第4章…

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑&#xff0c;导致原因为NC系统在增加公共薪资项目的时候&#xff0c;扩展字段报错了&#xff0c;第一次遇到这种情况&#xff0c;折腾了很久终于解决&#xff0c;记下解决方案&#xff1a; 1&#xff0c;将SQL数据…

Flutter之页面布局二

目录&#xff1a; 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…

ARM------硬件程序开发

硬件程序开发流程 相关硬件的工作原理 理解硬件的工作原理&#xff0c;明确硬件的功能和用途。 硬件连接 将硬件设备正确连接到开发板上。 编写程序 根据硬件功能编写相应的程序代码。 调试验证 通过调试工具验证程序的正确性&#xff0c;确保硬件功能正常。 控制LED的…

《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版

1、概述 源码放在文章末尾 根据上一篇文章回顾下利用QtC实现了一个简易的python编译器&#xff0c;类似pycharm或vsCode这样的编译器&#xff0c;该python编译器目前实现了如下功能&#xff1a; &#xff08;1&#xff09;支持编写python程序 &#xff08;2&#xff09;编写代…

Winform MQTT客户端连接方式

项目中使用到Winform的数据转发服务&#xff0c;所以记录下使用到的方法。 一.创建单例模板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp.Scripts {public class SingleTon&…

Windows强制删除任何你想删除的文件和文件夹

Windows强制删除任何你想删除的文件和文件夹 本教程适用于 Windows 10/11 系统&#xff0c;工具和命令均经过验证。 为什么删除会失败&#xff1f; 权限不足&#xff1a;文件或文件夹可能需要管理员权限才能删除。文件被占用&#xff1a;某个程序正在使用目标文件&#xff0c…

Jmeter如何使用MD5进行加密?

在软件测试中&#xff0c;使用 JMeter 对数据进行 MD5 加密是一项常见需求&#xff0c;尤其是在模拟用户登录等涉及密码加密的场景时。下面详细介绍在 JMeter 里运用 MD5 加密的具体步骤。 1. 添加 BeanShell 预处理器 JMeter 本身没有直接的 MD5 加密功能&#xff0c;但可以…

4-c语言中的数据类型

一.C 语⾔中的常量 1.生活中的数据 整数&#xff1a; 100,200,300,400,500 小数: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…

中钧科技通过数字赋能,编织“数字互联网”助力数字化进程!

时间飞逝转眼间2025年已过去四分之一&#xff0c;作为一名95后回顾当下的生活&#xff0c;忍不住感慨10年和现在的对比。发现现在的手机支付、网上挂号、APP打车、在线学习、网络订餐、线上协同办公都以逐渐成为人们生活、工作的常态。也正是在这样的常态背景下&#xff0c;加快…

AI重塑云基础设施,亚马逊云科技打造AI定制版IaaS“样板房”

AI正在彻底重塑云基础设施。 IDC最新《2025年IDC MarketScape&#xff1a;全球公有云基础设施即服务&#xff08;IaaS&#xff09;报告》显示&#xff0c;AI正在通过多种方式重塑云基础设施&#xff0c;公有云IaaS有望继续保持快速增长&#xff0c;预计2025年全球IaaS的整体规…