Qt 5.1 或更高版本:
我需要播放频率为 x 的通知声音 n 毫秒。如果我能像这样组合音调那就太好了:1000Hz 2 秒,然后 3000Hz 1 秒,..
最简单的方法是使用文件(WAV、MP3、..),例如如下所述:如何使用 Qt 播放声音但是我必须为每个场景生成这样的文件。
Qt 的音频输出示例在内存中生成此类音调 ( Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate))。我可以为我的目的编写这样一个生成器。但我必须这样做吗?
那么,仅播放频率 x n 毫秒的最简单方法是什么?
要在 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)
如果您需要更多示例代码,您可以在我刚刚开始的一个小项目中看到我是如何做到的。
| 归档时间: |
|
| 查看次数: |
6410 次 |
| 最近记录: |