QT编程之PCM音频处理

一、高级播放接口(未压缩编码的音频文件)

  1. QMediaPlayer

    • 支持MP3/WMA等压缩格式及网络流媒体播放,集成媒体控制(播放/暂停/进度调节)

    • 需设置QAudioOutput指定输出设备,支持播放速度调节(setPlaybackRate)‌

    • 代码示例:

      复制代码
      QMediaPlayer player;
      player.setSource(QUrl::fromLocalFile("audio.mp3"));
      player.play();  // 开始播放‌
  2. 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数据‌

五、开发注意事项

  1. 跨平台兼容性

    • Linux需安装pulseaudioalsa-lib驱动‌
    • Windows/Mac需确认音频设备支持指定格式‌
    • 结构体使用#pragma pack(1)避免对齐问题‌
  2. 实时音频处理

    • 采集使用QAudioInput,与播放代码结构类似‌
    • 网络传输时建议分块发送(每帧1024样本)‌
  3. 性能优化

    • 启用QIODevice::Unbuffered模式降低延迟‌
    • 多线程处理:解码/采集与播放分离‌
相关推荐
杀生丸学AI15 小时前
【世界模型】MotionForesight:视频模型应用于未来的三维场景流预测
音视频
开开心心就好19 小时前
视频播放器完美解码集成三款播放器切换使用
前端·人工智能·智能手机·电脑·音视频·virtualenv·pygame
cuijiecheng201820 小时前
RK3588音视频播放器方案对比
音视频
海带紫菜菠萝汤20 小时前
MSE (Media Source Extensions) 实战:流媒体分块加载与自适应码率
前端·javascript·音视频
七牛云行业应用20 小时前
ComfyUI + MiniMax H3 实战教程:全模态视频生成,API 和本地两种玩法
人工智能·大模型·音视频
AIVOClaw容剪21 小时前
AI 成片系统搭建如何让矩阵号差异化从「同一脚本 50 个号发」变成「反推提示词每号一版」——5 模块防止同质化被判搬运 · AI 视频智能体平台
人工智能·矩阵·音视频
AUV110721 小时前
SaaS 产品演示视频怎么做:从目标、脚本、演示数据到交付的可复现流水线
音视频·saas·产品演示
春末的南方城市21 小时前
消费级显卡迎来实时视频生成!FastVideo 开源 FastWan-QAD,RTX 5090 实现 1.8 秒生成 5 秒 480P 视频!
人工智能·深度学习·计算机视觉·aigc·音视频
OH_TPC1 天前
【鸿蒙优选三方库】@ohos/ijkplayer:在鸿蒙上像 B 站一样流畅播视频
华为·音视频·harmonyos·鸿蒙
ue星空1 天前
【Godot】AudioStreamPlayer2D音频播放
游戏引擎·音视频·godot