一、QAudioOutput的常见函数
QIODevice* start(); //开始
void stop(); //停止
void reset(); //重置
void suspend(); //暂停
void resume(); //恢复
int bufferSize() const; //缓冲大小
int bytesFree() const; //缓冲目前有多少数据
int periodSize() const; //内部硬件一次能播放多少
首先使用ffmpeg制作pcm,然后放到代码处
ffmpeg -i 1080.mp4 -f s16le out.pcm
#include <QtCore/QCoreApplication>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QThread>
//准备好pcm数据
//ffmpeg -i 1080.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"); //设置编码器
//大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
//小端模式:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
//一般操作系统都是小端,而通讯协议是大端的
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); //写入屏幕数据
}
fclose(fp);
delete buf;
buf = 0;
return a.exec();
}
注意QAudioFormat和QAudioOutput需要在qmake里添加
QT += multimedia
具体可以参考官方文档