10.QT-QAudioOutput类使用
时间:2022-07-24
本文章向大家介绍10.QT-QAudioOutput类使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本章需要用到的类如下:
- QAudioDeviceInfo类提供音频输出设备
- QAudioFormat类提供音频参数设置
- QAudioOutput类提供了用于将PCM原始音频数据发送到音频输出设备的接口。
1.QAudioDeviceInfo类
用来提供音频输出设备,并且包含该设备支持的格式,排序,通道,编码器,频率,采样率等, 用户可以通过bool isFormatSupported(const QAudioFormat &settings) 来判断是否支持该格式.用户一般通过defaultOutputDevice()来获取当前默认播放设备.
如果想获取所有音频输出设备可以通过availableDevices()成员函数,比如:
foreach(const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
{
qDebug() << "Device name: " << deviceInfo.deviceName();
}
2.QAudioOutput类
常用函数如下所示:
QAudio::Error QAudioOutput::error(); //获取当前错误信息
void QAudioOutput::suspend(); //暂停
void QAudioOutput::resume(); //恢复
void QAudioOutput::start(QIODevice *device) //启动播放,参数是QIODevice(需要通过write成员写入pcm数据数组)
QIODevice *QAudioOutput::start(); //打开设备并返回一个指向内部QIODevice的指针,通过write()便可以直接向其写入pcm数据进行播放.
QAudio::State QAudioOutput::state(); //获取当前QAudioOutput状态,状态如下所示:
//QAudio::ActiveState:正在播放中
//QAudio::SuspendedState:正在暂停中
//QAudio::StoppedState:已被停止,可能是被异常终止了
//QAudio::IdleState:处于空闲中,什么都没干
void QAudioOutput::setVolume(qreal volume); //设置音量 (0.0~1.0之间,默认音量为1.0)
void QAudioOutput::setBufferSize(int value); //重新设置缓冲区大小,需要在start()之前设置
int QAudioOutput::bufferSize() const; //获取缓冲区大小,默认为35280,需要start()后,才分配buff
int QAudioOutput::bytesFree() //返回音频缓冲区中可用的空闲字节数。
//注意:返回值仅在QAudio::ActiveState或QAudio::IdleState状态下有效,否则返回零。
int QAudioOutput::periodSize(); //周期大小(以字节为单位),每播放一次音频数据所需多少个数据量
//periodSize用来防止缓冲区欠运行和确保不间断回放所需的数据量
3.初始化QAudioOutput
开始播放音频流只需使用QIODevice调用start()即可。然后QAudioOutput将从io设备中获取所需的数据。所以播放音频文件是简单的如下:
QFile sourceFile;
QAudioOutput* audio;
sourceFile.setFileName("/tmp/test.raw");
sourceFile.open(QIODevice::ReadOnly);
QAudioFormat format;
// Set up the format, eg.
format.setSampleRate(44100); //设置采样率
format.setChannelCount(1); //设置通道数
format.setSampleSize(16); //样本数据16位
format.setCodec("audio/pcm"); //播出格式为pcm格式
format.setByteOrder(QAudioFormat::LittleEndian); //默认小端模式
format.setSampleType(QAudioFormat::UnSignedInt); //无符号整形数
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); //选择默认输出设备
if (!info.isFormatSupported(format))
{
qDebug()<<"输出设备不支持该格式,不能播放音频";
return;
}
audio = new QAudioOutput(format, this);
connect(audio, SIGNAL(stateChanged(QAudio::State)),this,SLOT(handleStateChanged(QAudio::State)));
audio->start(&sourceFile);
}
文件在播放过程中, 当遇到错误时,状态更改为QAudio::StoppedState,并发送stateChanged()信号函数,这时可以通过error()函数获取错误信息,注意:文件播放结束(QAudio::IdleState)后,需要停止设备:
void AudioOutputExample::handleStateChanged(QAudio::State newState)
{
switch (newState) {
case QAudio::IdleState:
// 数据已经没有了,播放完毕
audio->stop();
sourceFile.close();
delete audio;
break;
case QAudio::StoppedState:
// 音频设备已关闭,检查error是否异常关闭
if (audio->error() != QAudio::NoError) {
// Error handling
}
break;
case QAudio::SuspendedState:
// 音频被暂停
break;
case QAudio::ActiveState:
// 启动音频播放,正在解析中
break;
}
}
4.补充说明
由于QAudioOutput支持的输入数据必须是原始数据,所以播放mp3,WAV,AAC等格式文件,需要解封装后才能支持播放.
而在QT中,提供了QMediaPlayer类可以支持解封装,但是该类的解码协议都是基于平台的,如果平台自身无法播放,那么QMediaPlayer也无法播放.有兴趣的朋友可以去试试.
所以接下来,我们使用ffmpeg+QAudioOutput来实现一个简单的音频播放器
- python selenium2 开发环境搭建
- 聊聊同步辅助类CountDownLatch
- Java多线程编程笔记之Condition
- python selenium2示例 - 生成 HTMLTestRunner 测试报告
- python selenium2示例 - email发送
- pyhton-----break语句
- python unittest使用基本过程
- 基于unittest集成你的selenium2测试
- Selenium Webdriver Desired Capabilities
- 在Selenium Webdriver中使用XPath Contains、Sibling函数定位
- Python多线程Selenium跨浏览器测试
- Python Selenium设计模式-POM
- 基于Excel参数化你的Selenium2测试
- 创建你的第一个webdriver python代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Scrapyd发布爬虫的工具
- MySQL8.0.18 试用Hash Join
- InnoDB:表空间管理
- MyBatis 增删改查
- python分析wav文件
- CICD实战——服务自动构建与部署
- python+opencv实时视频目标检测
- python数据化运营分析实例---销售预测
- Leetcode 1444. 切披萨的方案数(DP,类似石材切割,二维前缀和)
- Python生成内涵图片
- Linux 下makefile实战 ——编写真实的C项目
- MySQL8功能详解——Common table expression (CTE)
- 游戏数据分析
- MySQL8功能详解——隐藏索引
- python 操作excel(附案例)