在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

Hor*_*ter 3 c++ audio qt5.1

Qt 5.1 或更高版本:

我需要播放频率为 x 的通知声音 n 毫秒。如果我能像这样组合音调那就太好了:1000Hz 2 秒,然后 3000Hz 1 秒,..

最简单的方法是使用文件(WAV、MP3、..),例如如下所述:如何使用 Qt 播放声音但是我必须为每个场景生成这样的文件。

Qt 的音频输出示例在内存中生成此类音调 ( Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate))。我可以为我的目的编写这样一个生成器。但我必须这样做吗?

那么,仅播放频率 x n 毫秒的最简单方法是什么?

jor*_*001 5

要在 Qt 中生成音调,我们可以将自己的 QBuffer 传递给要播放的 QAudioOutput。

看一下QAudioOutput 页面上的第一个示例。

我所做的就是在 QByteArray 中创建波形。请记住,这sin(2 * pi * frequency * i / sample_rate)将为您提供所需频率的正弦音:

#define FREQ_CONST ((2.0 * M_PI) / SAMPLE_RATE)

QByteArray* bytebuf = new QByteArray();
buf->resize(seconds * SAMPLE_RATE);

for (int i=0; i<(seconds * SAMPLE_RATE); i++) {
    qreal t = (qreal)(freq * i);
    t = t * FREQ_CONST;
    t = qSin(t);
    // now we normalize t
    t *= TG_MAX_VAL;
    (*bytebuf)[i] = (quint8)t;
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以获取该缓冲区并执行类似的操作来播放它:

// Make a QBuffer from our QByteArray
QBuffer* input = new QBuffer(bytebuf);
input->open(QIODevice::ReadOnly);

// Create an output with our premade QAudioFormat (See example in QAudioOutput)
QAudioOutput* audio = new QAudioOutput(format, this);
audio->start(input);
Run Code Online (Sandbox Code Playgroud)

如果您需要更多示例代码,您可以在我刚刚开始的一个小项目中看到我是如何做到的。