本章需要用到的类如下:

  • 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(); //设置采样率
format.setChannelCount(); //设置通道数
format.setSampleSize(); //样本数据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来实现一个简单的音频播放器

未完待续~

10.QT-QAudioOutput类使用的更多相关文章

  1. 用 Qt 的 QAudioOutput 类播放 WAV 音频文件

    用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件, ...

  2. Qt学习之路(1)------Qt常用类用法说明

    Qt常用类 向控制台输出文本 第一个例子,我们采用STL的方式: console.cpp #include <iostream> int main() { std::cout <&l ...

  3. 《第一行代码-李兴华》-10.3 System类

    10.3 System类 视频地址:System类 /** * * 统计某项操作执行时间 * */ long start = System.currentTimeMillis();//返回以毫秒为单位 ...

  4. Qt 串口类QSerialPort 使用笔记

    Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...

  5. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  6. 详解 QT 主要类 QWidget

    QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容. AD: 2013云计算架构师 ...

  7. 【学习笔记】QT常用类及应用

    一.QT基类: QObject 二.QT中常用的库 QT中的类根据功能划分在不同的库中,在用户属性.pro文件中可以看到. 三.Qt基本对话框的使用 常用5类: 通过类名可以直接调用类的静态成员函数. ...

  8. Qt字符串类——3.字符串的转换

    (1)QString::toInt()函数将字符串转换为整型数值,类似的函数还有toDouble().toFloat().toLong().toLongLong()等.下面举个例子说明其用法: QSt ...

  9. Qt 常用类——QStandardItemModel

    转载:落叶知秋时 类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构 ...

  10. Qt常用类——Qstring

    Qstring有一些方面跟C/C++中的string的使用,例如把一个字符串追加到另一个字符串中,也是用“+”.也有append函数等. 下面是是Qstring的一些常用的具体函数示例: Qt的QSt ...

随机推荐

  1. 滴滴推理引擎IFX:千万规模设备下AI部署实践

    桔妹导读:「滴滴技术」将于本月开始,联合各技术团队为大家带来精彩分享.你想了解的技术干货,深度专访,团队及招聘将于每周三与你准时见面.本月为「滴滴云平台事业群分享月」,在今天的内容中,云平台事业群-机 ...

  2. 如何实现字符串转换成整数(实现atoi内置函数)?

    题目描述 输入一个由数字组成的字符串,把它转换成整数并输出.例如:输入字符串"123",输出整数123. 给定函数原型int StrToInt(const char *str) , ...

  3. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  4. 看DLI服务4核心如何提升云服务自动化运维

    摘要:今天我们来说说DLI是如何实现监控告警来提升整体运维能力,从而为客户更好的提供Serverless的DLI. DLI是支持多模引擎的Serverless大数据计算服务,免运维也是其作为Serve ...

  5. 图论算法(二)最短路算法:Floyd算法!

    最短路算法(一) 最短路算法有三种形态:Floyd算法,Shortset Path Fast Algorithm(SPFA)算法,Dijkstra算法. 我个人打算分三次把这三个算法介绍完. (毕竟写 ...

  6. 虚拟化技术之kvm虚拟机创建工具virt-install

    在前边的博客中,我们创建KVM虚拟机用到了virt-manager,这个工具是一个图形化工具,创建虚拟机很方便:除此我们还是用virsh define/create +虚拟机配置文件来创建虚拟机,这种 ...

  7. idea配置ssm框架

    详细教程如下:https://blog.csdn.net/GallenZhang/article/details/5193215 https://blog.csdn.net/qq_28008917/a ...

  8. Sqlalchemy 事件监听与初始化

    sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中. 需求:当插入设置password字段时,自动加密 ...

  9. ubuntu ARM 源配置

    cat /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main deb-src http://mir ...

  10. nvm -- node 多版本管理器

    Node.js 越来越热,应用的场景也越来越多. 在开发中,我们可能同时在进行多个 node 项目,而这些不同的项目所使用的 node 版本又是不一样的,或者是要用更新的 node 版本进行试验和学习 ...