1. 创建工程时,添加QT的多媒体模块multimedia
2. 主要使用到的QT类:
QAudioFormat类创建输出音频格式对象,设置输出音频的样本率、样本大小、通道数、解码类型、字节序等参数;
QAudioOutput类创建音频播放设备对象;
QIODevice类创建IO操作对象;
#include <QtCore/QCoreApplication>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QThread>
//准备好pcm文件
//ffmpeg -i abc.mp4 -f s16le out.pcm
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QAudioFormat fmt;
fmt.setSampleRate(44100);
fmt.setSampleSize(16);
fmt.setChannelCount(2);
fmt.setCodec("audio/pcm");
fmt.setByteOrder(QAudioFormat::LittleEndian);
fmt.setSampleType(QAudioFormat::UnSignedInt);
QAudioOutput *out = new QAudioOutput(fmt);
QIODevice *io = out->start();//开始播放
int size = out->periodSize();//音频输出设备写入的单周期大小
char *buf = new char[size];
FILE *fp = fopen("out.pcm", "rb");
while (!feof(fp))
{
//判断音频输出设备的缓冲剩余空间是否大于单次写入大小,保证每次写入数据完全
if (out->bytesFree() < size)
{
QThread::msleep(1);
continue;
}
int len = fread(buf, 1, size, fp);
if (len <= 0) break;
io->write(buf, len);//写IO,这里的写入最好是按照out->periodSize()来,确保音频连续完整输出
}
fclose(fp);
fp = NULL;
delete buf;
buf = NULL;
delete out;
out = NULL;
return a.exec();
}