播放振荡/振动发出的声音

发布于 2024-09-18 06:14:55 字数 173 浏览 7 评论 0原文

我有一个振荡:对于每个时刻t,我都有一组样本

我需要播放这种振荡的声音(输出到扬声器)。

跨平台 C++(或 Qt)解决方案是首选,Windows 解决方案也不错。

请帮助我改进这个问题,如果你知道如何......

I have an oscillation: for each moment of time t, I have a set of samples.

I need to play the sound of this oscillation (output to speakers).

Cross-platform C++ (or Qt) solution is preferred, solution for Windows is also good.

And please help me improve the question, if you know how...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨落画卷 2024-09-25 06:14:55

这是使用 Qt 的示例; http://diotavelli.net/PyQtWiki/Playing%20a%20sound%20with% 20QtMultimedia

它使用QAudioOutput来实现PCM音频播放。

Here is an example using Qt; http://diotavelli.net/PyQtWiki/Playing%20a%20sound%20with%20QtMultimedia

It uses QAudioOutput to achieve PCM audio playback.

假情假意假温柔 2024-09-25 06:14:55

这是 C++/Qt 代码:

#include<math.h>
#include<QBuffer>
#include<QAudioFormat>
#include<QAudioOutput>
...
QAudioFormat format;
format.setChannels(1);
format.setFrequency(22050);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioOutput* output=new QAudioOutput(format);
QBuffer* buffer=new QBuffer();
QByteArray data;
for (int i=0;i<22050*2;i++)
{
    short value=(/*Volume:*/10000*sin(2*3.1415*/*Frequency:*/600*i/22050.0));
    data.append((char*)&value,2);
}
buffer->setData(data);
buffer->open(QIODevice::ReadOnly);
buffer->seek(0);
output->start(buffer);

相当肮脏的解决方案,我认为它有内存泄漏......但它有效!

Here is C++/Qt code:

#include<math.h>
#include<QBuffer>
#include<QAudioFormat>
#include<QAudioOutput>
...
QAudioFormat format;
format.setChannels(1);
format.setFrequency(22050);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioOutput* output=new QAudioOutput(format);
QBuffer* buffer=new QBuffer();
QByteArray data;
for (int i=0;i<22050*2;i++)
{
    short value=(/*Volume:*/10000*sin(2*3.1415*/*Frequency:*/600*i/22050.0));
    data.append((char*)&value,2);
}
buffer->setData(data);
buffer->open(QIODevice::ReadOnly);
buffer->seek(0);
output->start(buffer);

Quite dirty solution, and I think it has memory leaks... But it works!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文