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

C++ Is live PCM fft audio processing with OpenAL?

本文关键字:PCM 实时 fft 音频 处理 OpenAL C++      更新时间:2023-10-16

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

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

这是我将波形数据加载到字节数组中的函数,这些字节稍后可以转换为整数进行处理,我用来播放数据的只是 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;
}

感谢您的任何和所有帮助。

编辑:对于任何可能感兴趣的人,我使用它作为参考编写了函数以了解如何格式化 WAV 文件

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

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

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