提取音频PCM文件
ffmpeg.exe -i 1080.mp4 -f s16le 1080.pcm
示例程序
#include <QCoreApplication>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QThread>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建并设置AudioFormat参数
QAudioFormat fmt;
fmt.setSampleRate(44100);
fmt.setSampleSize(16);
fmt.setByteOrder(QAudioFormat::LittleEndian);
fmt.setChannelCount(2);
fmt.setSampleType(QAudioFormat::UnSignedInt);
fmt.setCodec("audio/pcm");
// 检测默认的音频播放设备是否支持该AudioFormat
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(fmt))
{
qDebug() << "unsupported format, can not play";
qDebug() << "support sample rate = " << info.supportedSampleRates();
qDebug() << "support sample size = " << info.supportedSampleSizes();
qDebug() << "support byteorder = " << info.supportedByteOrders();
qDebug() << "support channelcount " << info.supportedChannelCounts();
qDebug() << "support sampletype = " << info.supportedSampleTypes();
qDebug() << "support decodes = " << info.supportedCodecs();
return -1;
}
// 创建AudioOutput并开始播放
QAudioOutput out(fmt);
QIODevice *io = out.start();
int size = out.periodSize();
char *buf = new char[size];
FILE *fp = NULL;
fopen_s(&fp, "1080.pcm", "rb");
while(!feof(fp)) {
// 仅在AudioOutput有足够空间的时候写入数据
if (out.bytesFree() < size) {
QThread::msleep(1);
continue;
}
// 每次读取一个周期的数据写入到QAudioOutput进行播放
int len = fread(buf, 1, size, fp);
if (len < 0) {
// 文件读取完成返回
break;
}
io->write(buf, len);
}
// 释放资源
fclose(fp);
delete [] buf;
buf = NULL;
fp = NULL;
return a.exec();
}