簡體   English   中英

獲取WAV文件的幀和樣本

[英]Get frames and samples of a wav file

首先,我試圖在沒有任何專有庫的情況下執行此操作,以使其具有更高的可移植性,並且我對這里發生的事情有了更好的了解。 我可以編寫自己的類和庫來處理重復的功能(解析標頭等)。

因此,我想知道如何通過流讀取WAV / RIFF文件,以便可以計算有關所述音頻文件的信息(即文件中音頻的長度,多少樣本,多少幀等)。 然后遍歷那些框架或樣本以實現其他功能。

我知道它將通過fstream將其讀取為二進制文件,並按照RIFF規范中的說明允許頭文件(並從頭文件中獲取一些信息),但是如何辨別字節到幀或樣本以及長度?

我可以在其他語言中找到解決此問題的方法,但是在C ++中沒有看到與其直接相關的任何內容。

我相信讀取WAV文件和讀取任何二進制文件(例如位圖)都是一樣的。 基本思想是先讀取文件的標頭,然后根據標頭中顯示的信息讀取數據。 標頭通常可以填充到C數據結構中,您可以直接使用該信息。

struct wavfile
{
    char   id[4];            // should always contain "RIFF"
    int    totallength;      // total file length minus 8
    char   wavefmt[8];       // should be "WAVEfmt "
    int    format;           // 16 for PCM format
    short  pcm;              // 1 for PCM format
    short  channels;         // channels
    int    frequency;        // sampling frequency
    int    bytes_per_second;
    short  bytes_by_capture;
    short  bits_per_sample;
    char   data[4];          // should always contain "data"
    int    bytes_in_data;
};

FILE * fp = fopen("file.wav", "rb");
wavfile info;
if (fp) {
    fread(&info, 1, sizeof(wavfile), fp);
    // try to read data here
}

我認為WAV文件中沒有框架,只需確保每個采樣點的長度為wavinfo.bits_per_sample / 8 如果值為2,我們可以讀取一個short示例。

是一個博客,還有更多示例代碼,但是我想您仍然需要進行一些調試。

WAV / RIFF標頭告訴您采樣大小(8位,16位等); 它還會告訴您字節順序,以及每個樣本應被解釋為帶符號還是無符號(16位以上)。 以及頻道數

不知道您還需要什么。 這幾乎是瀏覽文件所需要的全部。 閱讀引用的鏈接,似乎幾乎可以回答所有問題。

碰巧是一個快速的小技巧,可以從我連接到收音機的聲卡中獲取音頻時,將其用作參考。 前面提到的hack會動態分析音頻,以找到無聲點,然后將無聲點處的音頻流拆分為單個文件。 生成的數據通過了足以使.mp3編碼器接受的.wav文件,產生了.mp3文件,可以將其轉儲到mp3播放器中,以便以后可以收聽我喜歡的廣播節目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM