一、高级播放接口(未压缩编码的音频文件)
QMediaPlayer
- 支持MP3/WMA等压缩格式及网络流媒体播放,集成媒体控制(播放/暂停/进度调节)
- 需设置
QAudioOutput
指定输出设备,支持播放速度调节(setPlaybackRate) - 代码示例:
QMediaPlayer player; player.setSource(QUrl::fromLocalFile("audio.mp3")); player.play(); // 开始播放
- QSoundEffect
1.专为低延迟音效设计,适合游戏/UI反馈音,支持WAV格式
2.支持循环播放(setLoopCount)和实时音量调节
3.代码示例:QSoundEffect effect; effect.setSource(QUrl::fromLocalFile("beep.wav")); effect.play(); // 延迟低于50ms
二、底层音频控制
- QAudioOutput/QAudioSink
- 直接处理PCM数据流,适合FFmpeg解码后的原始音频播放
- Qt5使用
QAudioOutput
,Qt6重命名为QAudioSink
,需指定采样率/声道数等参数 - 典型应用:
QAudioFormat format; format.setSampleRate(44100); format.setChannelCount(2); QAudioSink sink(format); sink.start(data_device); // data_device提供PCM数据流
三、PCM音频播放
Qt5/Qt6通用方案
// 头文件包含
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput> // Qt5
#include <QAudioSink> // Qt6
// 创建音频格式
QAudioFormat format;
format.setSampleRate(44100); // 采样率需与PCM文件一致
format.setChannelCount(2); // 声道数(1=单声道,2=立体声)
format.setSampleFormat(QAudioFormat::Int16); // 位深(必须与PCM编码匹配)
// 打开PCM文件
QFile pcmFile("audio.pcm");
if(pcmFile.open(QIODevice::ReadOnly)) {
// 检查设备支持
QAudioDevice device = QMediaDevices::defaultAudioOutput();
if(!device.isFormatSupported(format)) {
qWarning() << "不支持的音频格式"; // 需调整参数重试
return;
}
// 创建播放对象(Qt5用QAudioOutput, Qt6用QAudioSink)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QAudioOutput* audioOutput = new QAudioOutput(format);
audioOutput->start(&pcmFile); // 启动播放
#else
QAudioSink* audioSink = new QAudioSink(format);
audioSink->start(&pcmFile); // Qt6新版API
#endif
}
关键参数说明
参数 | 典型值 | 注意事项 |
---|---|---|
采样率 | 8000/44100/48000 Hz | 必须与PCM文件生成时一致 |
样本格式 | Int16/UInt8/Float | FFmpeg常用s16le对应Int16 |
缓冲区大小 | 4000-8192 bytes | 过小导致卡顿,过大会增加延迟 |
四、 PCM转WAV
// 添加WAV文件头(44字节)
struct WAVHeader {
char riff[] = {'R','I','F','F'};
uint32_t fileSize; // 文件总大小-8
char wave[] = {'W','A','V','E'};
// ... 其他字段根据参数填充
};
QFile wavFile("audio.wav");
wavFile.open(QIODevice::WriteOnly);
wavFile.write((char*)&header, sizeof(WAVHeader)); // 写入头信息
wavFile.write(pcmData); // 追加PCM数据
五、开发注意事项
跨平台兼容性
- Linux需安装
pulseaudio
或alsa-lib
驱动 - Windows/Mac需确认音频设备支持指定格式
- 结构体使用
#pragma pack(1)
避免对齐问题
- Linux需安装
实时音频处理
- 采集使用
QAudioInput
,与播放代码结构类似 - 网络传输时建议分块发送(每帧1024样本)
- 采集使用
性能优化
- 启用
QIODevice::Unbuffered
模式降低延迟 - 多线程处理:解码/采集与播放分离
- 启用