C++ 是使用 OpenAL 进行实时 PCM fft 音频处理
C++ Is live PCM fft audio processing with OpenAL?
我正在做一个项目,该项目涉及在播放时必须通过 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,并可能为用户可视化数据。
同样,音频库可能会管理线程,因此您无需担心确切的线程实现或库。但请务必使用互斥锁正确管理共享数据。
相关文章:
- 从数据库实时显示QT c++中的数据
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 有没有办法使用 c++ 实时阅读文本?
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 将相机数据从服务器实时流式传输到客户端
- 将实时(非静态)放在qt(c ++)上
- 线程之间的实时数据共享
- 如何在实时应用程序中锁定线程
- OpenCV - 来自相机的实时馈送不流畅
- C++ - 对 PCM::getInstance() 的未定义引用问题
- 如何提高 OpenCV 实时检测器应用程序的帧率?
- 使用 Opencv 将姿势值实时写入文本文件
- Firebase C++ Windows 上的实时数据库连接丢失
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- 如何实时捕获相机的视频?
- ROOT中的实时更新
- C# 的垃圾回收会给实时音频应用程序带来问题吗?
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- C++ 是使用 OpenAL 进行实时 PCM fft 音频处理