gpt4 book ai didi

C++ 是否使用 OpenAL 进行实时 PCM fft 音频处理?

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:48 33 4
gpt4 key购买 nike

我正在从事一个项目,该项目将涉及在播放时必须通过 fft 处理 PCM 音频数据,最好是同步处理。我正在使用 linux g++ 编译器,目前正在使用 OpenAL 读取和播放音频数据。

我的问题是:有没有更好的方法在播放音频时使用 fft 实时处理 PCM 音频数据然后使用线程?如果不是,那么什么线程库最适合用于这些目的。

这是我将波形数据加载到字节数组中的函数,这些数据稍后可以转换为 int 进行处理,我用来播放数据的全部是 OpenAL。

    char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){
char buffer[4];
ifstream in(fn, ios::binary);
in.read(buffer, 4); //ChunkID "RIFF"
if(strncmp(buffer, "RIFF", 4) != 0){
cerr << "this is not a valid wave file";
return NULL;
}
in.read(buffer,4); //ChunkSize
in.read(buffer,4); //Format "WAVE"
in.read(buffer,4); // "fmt "
in.read(buffer,4); // 16
in.read(buffer,2); // 1
in.read(buffer,2); // NUMBER OF CHANNELS
chan = convertToInt(buffer,2);
in.read(buffer,4); // SAMPLE RATE
samplerate = convertToInt(buffer,4);
in.read(buffer,4); // ByteRate
in.read(buffer,2); // BlockAlign
in.read(buffer,2); // bits per sample
bps = convertToInt(buffer,2);
in.read(buffer,4); // "data"
in.read(buffer,4);
size = convertToInt(buffer,4);
char * data = new char[size];
in.read(data,size);
return data;
}

感谢您提供的所有帮助。

编辑:对于任何可能感兴趣的人,我使用 this 编写了函数作为引用知道WAV 文件是如何格式化的

最佳答案

您希望使用 OpenAL 执行 FFT 吗?我不知道这是否可能。您的代码可能会执行 FFT。

您不需要显式设置任何线程。但是,您的音频输出库可能会代表您这样做。我不熟悉 OpenAL,但许多音频库的操作方式是让您指定一个回调,将更多音频输入输出。因此,您的主程序将从音频文件加载音频,将其填充到缓冲区(可能受互斥锁保护)以供音频回调读取,在音频窗口上计算 FFT,并可能为用户可视化数据。

同样,音频库可能会管理线程,因此您无需担心确切的线程实现或库。但一定要使用互斥体正确管理共享数据。

关于C++ 是否使用 OpenAL 进行实时 PCM fft 音频处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792701/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com