如何在Qt 6.4.2中播放运行时生成的正弦波?
Qt 6.4.2 播放运行时生成的正弦波方案
Qt 6.4.2 支持通过QByteArray或QBuffer播放声音,但接口和 Qt 5 差异较大——你提到的QAudioOutput::start(QBuffer*)方法在 Qt 6 中已被移除,取而代之的是**QAudioSink**类,它是 Qt 6 多媒体模块中负责音频输出的核心类之一。
实现步骤及代码示例
配置项目依赖
在项目的.pro文件中添加多媒体模块依赖:QT += multimedia定义音频格式
首先要设置符合系统要求的音频格式(采样率、通道数、样本格式等),可以直接指定或使用系统音频设备的推荐格式:QAudioFormat format; // 手动指定格式 format.setSampleRate(44100); format.setChannelCount(1); // 单声道 format.setSampleFormat(QAudioFormat::Int16); // 16位采样 // 可选:验证格式是否被当前设备支持,若不支持则使用设备推荐格式 QAudioDevice info(QAudioDevice::defaultOutputDevice()); if (!info.isFormatSupported(format)) { format = info.preferredFormat(); }生成正弦波数据到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); }使用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
相关产品推荐
相关产品推荐

