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