[英]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.