Qt音频输出:QAudioOutput详解与示例
1. 简介
QAudioOutput是Qt多媒体框架中的一个关键类,它提供了将PCM(脉冲编码调制)原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分,QAudioOutput允许开发者在应用程序中实现音频播放功能,支持多种音频格式和设备配置。
QAudioOutput的主要作用是将音频数据流传输到系统音频输出设备,如扬声器或耳机。它与QAudioInput类相对应,后者用于从音频输入设备(如麦克风)捕获音频数据。这两个类共同构成了Qt音频处理的基础,为实现完整的音频录制、处理和播放流程提供了必要的工具。
在Qt多媒体架构中,QAudioOutput属于较低级别的音频处理API,它提供了对音频硬件的直接访问,使开发者能够实现低延迟的音频播放。相比之下,QMediaPlayer类则提供了更高层次的抽象,适用于播放常见格式的音频和视频文件,但可能无法满足实时性和低延迟的需求。
2. 环境准备
-
模块依赖: 在
.pro文件中添加QT += multimedia -
头文件:
#include <QAudioOutput>;#include<QAudioFormat>;#include<QAudioDeviceInfo>
3. 核心类介绍
3.1 QAudioOutput
-
功能: 管理音频输出设备,控制播放状态(播放/暂停/停止)。
-
关键方法:
-
start(QIODevice*): 绑定输入设备并开始播放。 -
stop(): 停止播放并释放资源。 -
setVolume(float): 设置音量(0.0~1.0)。
-
3.2 QAudioFormat
-
作用: 定义音频格式参数,包括采样率、声道数、样本大小等。
-
常用设置:
QAudioFormat format; format.setSampleRate(44100); // 44.1kHz format.setChannelCount(2); // 立体声 format.setSampleSize(16); // 16位 format.setCodec("audio/pcm"); // PCM编码 format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt);
3.3 QIODevice
-
角色: 作为音频数据的来源(如文件、网络流或内存缓冲区)。
4. 使用步骤
4.1 初始化音频设备
// 创建音频格式对象
QAudioFormat format;
// ...(设置format参数)// 检查设备是否支持该格式
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {qWarning() << "音频格式不支持!";format = info.nearestFormat(format); // 自动匹配最接近的格式
}// 创建QAudioOutput实例
QAudioOutput* audioOutput = new QAudioOutput(format, this);
4.2 准备音频数据
QFile audioFile("path/to/audio.pcm");if (!audioFile.open(QIODevice::ReadOnly)) {qDebug() << "无法打开音频文件";return -1;}
4.3 播放音频
audioOutput->start(&audioFile); // 开始播放
5. 完整示例代码
// 配置音频格式QAudioFormat format;format.setSampleRate(44100);format.setChannelCount(2);format.setSampleSize(16);format.setCodec("audio/pcm");format.setByteOrder(QAudioFormat::LittleEndian);format.setSampleType(QAudioFormat::SignedInt);// 检查设备是否支持该格式QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());if (!info.isFormatSupported(format)) {qWarning() << "音频格式不支持!";format = info.nearestFormat(format); // 自动匹配最接近的格式}// 创建QAudioOutput对象QAudioOutput *audioOutput = new QAudioOutput(info,format, this);// 打开音频文件QFile audioFile("path/to/audio.pcm");if (!audioFile.open(QIODevice::ReadOnly)) {qDebug() << "无法打开音频文件";return -1;}
#if 1 //直接播放文件audioOutput->start(&audioFile);
#else //通过QIODevice的write写入播放音频,精准控制 // 获取QIODevice用于数据传输QIODevice *device = audioOutput->start();if (!device) {qDebug() << "无法启动音频输出";delete audioOutput;return -1;}// 传输音频数据char buffer[4096];qint64 bytesWritten;while ((bytesWritten = audioFile.read(buffer, sizeof(buffer))) > 0) {// 写入数据qint64 bytesFree = audioOutput->bytesFree();if (bytesFree >= bytesWritten) {device->write(buffer, bytesWritten);} else {// 如果缓冲区已满,等待并重试QThread::msleep(10);device->write(buffer, bytesWritten);}}// 完成播放device->close();
#endifaudioOutput->stop();delete audioOutput;audioFile.close();
6. 常见问题与解决方案
6.1 无声音输出
可能原因:
-
音频格式配置不正确
-
设备选择错误
-
缓冲区管理不当
解决方案:
-
确保音频格式配置正确,特别是采样率、通道数和样本格式
-
检查是否选择了正确的音频输出设备
-
确保音频数据确实被正确传输到设备
6.2 音频抖动或延迟
可能原因:
- 缓冲区大小不合适
- 系统资源不足
- 线程优先级设置不当
解决方案:
- 调整缓冲区大小以平衡延迟和稳定性
- 确保应用有足够资源
- 设置适当的线程优先级
// 调整缓冲区大小
format.setBufferSize(1024); // 尝试较小的缓冲区以减少延迟
6.3 实时音频处理
-
建议: 继承
QIODevice并重写readData(),动态生成或处理音频流。
相关文章:
Qt音频输出:QAudioOutput详解与示例
1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类,它提供了将PCM(脉冲编码调制)原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分,QAudioOutput允许开发者在应用程序中实现音频播放功能,支持多种音…...
springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式
目录 springboot介绍 核心特性 快速搭建 Spring Boot 项目 方式一:使用 Spring Initializr 方式二:使用 IDE 插件 示例代码 1. 创建项目并添加依赖 2. 创建主应用类 3. 创建控制器类 4. 运行应用程序 配置文件 部署和监控 部署 监控 与其…...
Android学习之Material Components
以下是 Material Design 提供的核心控件列表(基于最新 Material Components for Android 库),按功能分类整理: 1. 基础按钮类 控件名称类名说明MaterialButtoncom.google.android.material.button.MaterialButton遵循 Material 规…...
sentinel新手入门安装和限流,热点的使用
1 sentinel入门 1.1下载sentinel控制台 🔗sentinel管理后台官方下载地址 下载完毕以后就会得到一个jar包 1.2启动sentinel 将jar包放到任意非中文目录,执行命令: java -jar 名字.jar如果要修改Sentinel的默认端口、账户、密码ÿ…...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
一、安装步骤 1.基础环境安装 安装显卡驱动、cuda,根据自己硬件情况查找相应编号,本篇不介绍这部分内容,只给出参考指令,详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…...
ANTLR 实战_从零开始构建自定义语言解析器
1. 引言 1.1 什么是 ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于构建语言解析器、编译器和解释器。 1.2 ANTLR 的历史与发展 ANTLR 由 Terence Parr 创建,最初发布于 1995 年。经过多次版本更新,ANTLR 已成为构建解析器的首选工…...
CTF类题目复现总结-hashcat 1
一、题目地址 https://buuoj.cn/challenges#hashcat二、复现步骤 1、下载附件,解压得到What kind of document is this_文件; 2、用010 Editor打开What kind of document is this_文件,发现是office文件; 3、将后缀名改为ppt时…...
4月5日作业
需求: 1.按照图示的VLAN及IP地址需求,完成相关配置 2.要求SW 1为VLAN 2/3的主根及主网关 SW2为VLAN 20/30的主根及主网关,SW1和 SW2互为备份 3.可以使用super vlan 4.上层通过静态路由协议完成数据通信过程 5.AR1为企业出口路由器…...
Bert论文解析
文章目录 BERT:用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑:为什么没有标注的数据可以用来预训练模型?1. 掩码语言模型(Masked Language Model, MLM)2. 下一句预测(Nex…...
无招回归阿里
这两天,无招回归阿里的新闻被刷屏了。无招创业成立的两氢一氧公司无招的股份也被阿里收购,无招以这种姿态回归阿里,并且出任钉钉的 CEO。有人说,这是对 5 年前“云钉一体”战略的纠偏。现在确实从云优先到 AI 优先,但云…...
初探:简道云平台架构及原理
一、系统架构概述 简道云作为一款低代码开发平台,其架构设计以模块化和云端协同为核心,主要分为以下层次: 1. 前端层 可视化界面:基于Web的拖拽式表单设计器,支持动态渲染(React/Vue框架)。多…...
LeetCode 热题 100 堆
215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 …...
面试常被问道OSPF的问题
面试中经常会涉及到OSPF相关的问题,作为网络工程师,我们对OSPF的了解可不能仅停留在“我知道它是路由协议”这么表面。 想面试官满意,拿到Offer,必须能回答得出细节,深度挖掘它的工作原理、配置技巧、以及应用场景。 …...
Redis(笔记)
简介: 常用数据类型: 常用操作命令: Redis的Java客户端: 操作字符串类型的数据: 操作Hash类型的数据: 操作列表类型的数据: 操作集合类型的数据: 操作有序集合类型数据: 通用命令…...
bootloader+APP中,有些APP引脚无法正常使用?
问:bootloaderAPP程序中,为什么有些APP引脚无法正常使用?无法设置高低电平 主控芯片GD32F415,参考案例bootloader中的引脚使用: 参考案例APP程序的引脚使用: 以及个人使用的无线模组,高电平使能…...
高并发内存池:原理、设计与多线程性能优化实践
高并发内存池是一种专门为多线程环境设计的内存管理机制,其核心目标是通过优化内存分配和释放过程,解决传统内存分配器(如malloc/free)在高并发场景下的性能瓶颈,显著提升多线程程序的内存访问效率。 目录 一、核心设计…...
基于内容的课程推荐网站的设计与实现00(SSM+htmlL)
基于内容的课程推荐网站的设计与实现(SSMhtml) 该系统是一个基于内容的课程推荐网站,旨在为用户提供个性化的课程推荐。系统包含多个模块,如教学视频、教学案例、课程信息、系统公告、个人中心和后台管理。用户可以通过首页访问不同的课程分类ÿ…...
生活电子常识--删除谷歌浏览器搜索记录
前言 谷歌浏览器会记录浏览器历史搜索,如果不希望看到越来越多的搜索记录,可以如下设置 解决 设置-隐私-自动填充表单 这个和浏览器记录的密码没有关系,可以放心删除...
学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 纹理贴图1.1.1 ☘️…...
Git常用问题收集
gitignore 忽略文件夹 不生效 有时候我们接手别人的项目时,发现有的忽略不对想要修改,但发现修改忽略.gitignore后无效。原因是如果某些文件已经被纳入版本管理在.gitignore中忽略路径是不起作用的,这时候需要先清除本地缓存,然后…...
蓝桥杯基础算法-字符串与集合
对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析:set的唯一性,取出重复的子串 eg: 下标0截取的范围:【0,最大下标】 下标1截取的范围:【1,最大下标…...
animals_classification动物分类
数据获取 深度学习训练中第一个是获取数据集,数据集的质量很重要,我们这里做的是动物分类,大致会选择几个动物,来做一个简单的多分类问题,数据获取的方法,鼠鼠我这里选择使用爬虫的方式来对数据进行爬取&a…...
对解释器模式的理解
对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...
解决Oracle PL/SQL中“表或视图不存在“错误的完整指南
解决Oracle PL/SQL中"表或视图不存在"错误的完整指南 前言问题概述根本原因分析一、 编译时与运行时验证差异二、权限问题三、 Schema命名问题 实际案例演示案例1:动态分表查询案例2:权限不足的场景 实用排查步骤排查流程图最佳实践建议解决方…...
【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
StorageClass 使得用户能够根据不同的存储需求动态地申请和管理存储资源。 StorageClass 定义了如何创建存储资源,并指定了存储供应的配置,例如存储类型、质量、访问模式等。为动态存储供应提供了基础,使得 Kubernetes 可以在用户创建 PVC 时…...
linux如何查看当前系统的资源占用情况
在 Linux 系统中,有多个命令可以查看当前系统的资源占用情况。以下是一些常用的命令及其说明: 1. 查看内存使用情况:free free -h-h 参数表示以人类可读的格式显示(如 MB, GB)。输出示例: to…...
Arduino示例代码讲解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵
Arduino示例代码讲解:Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵 Row-Column Scanning an 8x8 LED matrix with X-Y input LED矩阵功能概述硬件部分:软件部分:代码逐行解释定义常量定义变量`setup()` 函数`loop()` 函数`readSensors()` 函数`refreshScr…...
SSH远程连接服务器(cursor)
安装Remote-SSH插件 Cursor是基于VSCode的,因此支持VSCode的Remote-SSH功能。打开Cursor,进入扩展市场(左侧活动栏的“Extensions”图标)。搜索“Remote - SSH”插件并安装(由Microsoft提供)。 配置SSH 在…...
笔记:docker安装(ubuntu 20.04)
sudo apt update #sudo:以 超级用户权限 运行命令。apt update:更新 APT 软件包管理器 的软件源列表,确保安装的是最新版本的软件。sudo apt install docker.io -y #apt install docker.io:安装 Docker; -y&#x…...
idea gitlab 操作
1.拉取脚本 账号登录 就可以获取git代码 2. 版本回退 hard暴力回退到暂存区 缓存区消失 3.版本合并 切换到目标分区 选择点击开发分区 进行合并...
