You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT6录音仅生成WAV文件头,伴QWaitCondition互斥锁错误求助

解决QT6.5.2音频录制无内容及崩溃问题

问题核心原因

你的程序存在以下关键问题:

  1. QMediaFormat配置混淆:错误将Wave作为音频编码设置,实际Wave是文件容器格式,对应的标准音频编码应为PCM
  2. 格式解析逻辑缺失:未结合音频输入设备解析兼容格式,导致录制参数与硬件不匹配
  3. Debian下资源异常:格式不兼容引发底层线程锁操作失败,最终导致程序崩溃

修复方案

修改媒体格式初始化、音频输入配置部分,确保参数与设备完全兼容:

修改后的构造函数代码

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 获取并校验默认音频输入设备
    const QAudioDevice inputDevice = QMediaDevices::defaultAudioInput();
    if (!inputDevice.isValid()) {
        qCritical() << "无可用音频输入设备";
        return;
    }

    // 直接绑定设备初始化音频输入
    audioInput = new QAudioInput(inputDevice, this);

    // 正确配置WAV格式:Wave为容器,PCM为音频编码
    formatAudio = new QMediaFormat(QMediaFormat::Wave);
    formatAudio->setAudioCodec(QMediaFormat::AudioCodec::PCM);
    // 结合输入设备解析兼容格式,避免参数冲突
    if (!formatAudio->resolveForEncoding(inputDevice)) {
        qWarning() << "无法解析兼容的编码格式";
    }

    // 初始化录制器,先设置格式再调整参数
    recorder = new QMediaRecorder(this);
    recorder->setMediaFormat(*formatAudio);
    // 设置设备支持的参数(可通过inputDevice.supportedSampleRates()确认支持值)
    recorder->setAudioChannelCount(2);
    recorder->setAudioSampleRate(48000);
    recorder->setOutputLocation(QUrl::fromLocalFile("/tmp/test"));

    // 绑定捕获会话
    session = new QMediaCaptureSession(this);
    session->setAudioInput(audioInput);
    session->setRecorder(recorder);

    // 使用现代Qt信号槽语法替代旧宏定义
    connect(recorder, &QMediaRecorder::recorderStateChanged, this, &MainWindow::recStatCh);
    connect(recorder, &QMediaRecorder::errorOccurred, this, &MainWindow::recErrOc);
    connect(recorder, &QMediaRecorder::errorChanged, this, &MainWindow::recErrCh);
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startRecording);
}

关键修改说明

  1. 容器与编码分离:明确Wave是文件容器,音频编码使用WAV标准的PCM格式
  2. 设备兼容校验:通过resolveForEncoding(inputDevice)确保格式被当前音频设备支持,避免参数不匹配
  3. 参数设置顺序:先设置媒体格式,再调整录制器的通道数、采样率,确保参数与格式兼容
  4. 信号槽语法升级:使用Qt5+的类型安全信号槽语法,避免旧宏定义的潜在问题

环境依赖检查

  • Debian 12:安装QT6多媒体后端依赖,确保声卡访问权限:
    sudo apt install qt6-multimedia-plugins libpulse-dev
    sudo usermod -aG audio $USER
    
  • Windows 10:确认QT安装时勾选了Qt 6.5.2 > Multimedia组件,以及对应的Windows媒体后端

验证步骤

修改代码后重新编译运行,录制完成后检查WAV文件大小(正常录制应远大于仅文件头的几十字节),同时观察Debian下是否仍出现锁错误。

内容的提问来源于stack exchange,提问作者dewerk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:38:23