繁体   English   中英

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

[英]C++ Is live PCM fft audio processing with OpenAL?

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

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

这是我将wave数据加载到字节数组中的函数,以后可以将它们转换为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;
}

感谢您的所有帮助。

编辑:对任何有兴趣的人,我都以此为参考编写了函数,以了解WAV文件的格式

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM