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

如何在Qt 6.4.2中播放运行时生成的正弦波?

Qt 6.4.2 播放运行时生成的正弦波方案

Qt 6.4.2 支持通过QByteArray或QBuffer播放声音,但接口和 Qt 5 差异较大——你提到的QAudioOutput::start(QBuffer*)方法在 Qt 6 中已被移除,取而代之的是**QAudioSink**类,它是 Qt 6 多媒体模块中负责音频输出的核心类之一。

实现步骤及代码示例

  1. 配置项目依赖
    在项目的.pro文件中添加多媒体模块依赖:

    QT += multimedia
    
  2. 定义音频格式
    首先要设置符合系统要求的音频格式(采样率、通道数、样本格式等),可以直接指定或使用系统音频设备的推荐格式:

    QAudioFormat format;
    // 手动指定格式
    format.setSampleRate(44100);
    format.setChannelCount(1); // 单声道
    format.setSampleFormat(QAudioFormat::Int16); // 16位采样
    
    // 可选:验证格式是否被当前设备支持,若不支持则使用设备推荐格式
    QAudioDevice info(QAudioDevice::defaultOutputDevice());
    if (!info.isFormatSupported(format)) {
        format = info.preferredFormat();
    }
    
  3. 生成正弦波数据到QByteArray
    计算并生成指定时长、频率的正弦波原始音频数据:

    const int durationMs = 2000; // 播放时长2秒
    const int sampleCount = format.sampleRate() * durationMs / 1000;
    QByteArray audioData;
    audioData.resize(sampleCount * format.bytesPerSample());
    
    qint16* samplePtr = reinterpret_cast<qint16*>(audioData.data());
    const double amplitude = 32767 * 0.5; // 音量设为最大的50%,避免音频削波
    const double frequency = 440.0; // 标准A4音(440Hz)
    
    for (int i = 0; i < sampleCount; ++i) {
        double time = static_cast<double>(i) / format.sampleRate();
        double sineValue = amplitude * qSin(2 * M_PI * frequency * time);
        samplePtr[i] = static_cast<qint16>(sineValue);
    }
    
  4. 使用QAudioSink播放QBuffer中的数据
    将生成的音频数据存入QBuffer,再通过QAudioSink启动播放:

    QBuffer audioBuffer(&audioData);
    if (!audioBuffer.open(QIODevice::ReadOnly)) {
        qWarning() << "Failed to open audio buffer";
        return;
    }
    
    QAudioSink* audioSink = new QAudioSink(format, this);
    // 播放结束后清理资源
    connect(audioSink, &QAudioSink::stateChanged, this, [audioSink, &audioBuffer](QAudio::State state) {
        if (state == QAudio::IdleState) {
            audioSink->stop();
            audioBuffer.close();
            audioSink->deleteLater();
        }
    });
    
    audioSink->start(&audioBuffer);
    

额外说明

  • 如果需要实时生成并播放音频(而非一次性生成全部数据),可以继承QIODevice实现自定义数据源,重写readData()方法实时生成音频样本,再传给QAudioSink::start()。
  • QAudioOutput在 Qt 6 中仍存在,但它偏向底层的音频输出控制,一般场景下QAudioSink更适合播放内存中的音频数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:01:25