簡體   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