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

3

Qt 5.1或更高版本:

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

最简单的方法是使用文件(WAV、MP3等),例如在此处描述的方式:如何使用Qt播放声音,但是对于我的每个场景都需要生成这样的文件。

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

那么,最简单的方法是只播放频率为x的声音,持续n毫秒吗?


你最终解决了这个问题吗?我无法进入那些教程,包括Jordan在答案中提供的链接。 - nicael
我已经在Qt中创建了一个类,并且它可以工作。但是,这有点像黑客行为,而且该类被纳入了使用其他一些与声音部分无关的类的项目中。我可以把C++类发送给您,但是您必须自己弄清楚。如果需要,让我知道您想要如何获取它。我不会将其粘贴在这里,因为它不符合SO规则,只会导致downvotes。 - Horst Walter
如果您能在pastebin.com上粘贴您的方法,那将非常友好。我完全不知道如何创建这个类,也没有找到清晰的教程,所以我卡住了。 - nicael
已将代码“原样”粘贴在此处:https://pastebin.com/LW6zhafm。请跟随`CSoundGenerator::playSelcal`以获取生成代码。 - Horst Walter
非常感谢您! - nicael
2个回答

5
为了在Qt中生成音调,我们可以将自己的QBuffer传递给QAudioOutput进行播放。
请查看QAudioOutput页面上的first example
我所做的是在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;
}

然后,我们可以拿到这个缓冲区并执行以下操作来播放它:
// 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);

如果你需要更多的示例代码,可以看看我刚开始的一个小项目这里中是如何实现的。

1
我认为你的意思是 bytebuf 而不是 buf。 - Ron U

1
你可以使用“window.h”包(不是QT的)。 然后,您只需使用Beep(频率,毫秒)。 对于您的示例,应分别为Beep(1000,2000)和Beep(3000,1000)。

3
好的有效提示,但我需要在不同的操作系统上运行该应用程序。 - Horst Walter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接