本章须要用到的类以下:html
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用来防止缓冲区欠运行和确保不间断回放所需的数据量
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等格式文件,须要解封装后才能支持播放.post
而在QT中,提供了QMediaPlayer类能够支持解封装,可是该类的解码协议都是基于平台的,若是平台自身没法播放,那么QMediaPlayer也没法播放.有兴趣的朋友能够去试试.学习
因此接下来,咱们使用ffmpeg+QAudioOutput来实现一个简单的音频播放器ui
未完待续,下章学习:11.QT-ffmpeg+QAudioOutput实现音频播放器this