wav文件頭詳解
符合RIFF(Resource Interchange File Format)規范的wav文件的文件頭記錄了音頻流的編碼參數等基本信息。wav文件由多個塊組成,至少包含RIFF標志塊、格式塊、數據頭塊和數據塊,所有數據均以小端模式存儲。(小端模式:按順序讀取時,先讀取的是數據的低位部分,后讀取的是數據的高位部分。如數據0x11, 0x00代表的是十六進制數0x0011,也就是3)。
一般的wav文件頭由以下數據組成:
偏移地址 | 字節數 | 數據類型 | 內容 |
00H ~ 03H | 4 | char | "RIFF", 資源交換文件RIFF標志,固定不變 |
04H ~ 07H | 4 | long | 文件長度,從下個字節開始到文件結束的總字節數。 計算結果為文件大小(可以從文件屬性中看)+8個字節(00H~07H) |
08H ~ 0BH | 4 | char | "WAVE", WAVE文件標志,固定不變 |
0CH ~ 0FH | 4 | char | "fmt ", fmt標志(最后一位為空格),固定不變 |
10H ~ 13H | 4 | long | 格式長度,一般為00000010H(=16),代表16PCM(量化結果為16bit) |
14H ~ 15H | 2 | int | 格式類別,1表示線性PCM編碼 |
16H ~ 17H | 2 | int | 通道數,1為單聲道,2為雙聲道 |
18H ~ 1BH | 4 | long | 采樣頻率(每秒的樣本數) |
1CH ~ 1FH | 4 | long | 每秒字節數,其值為:采樣頻率*通道數*樣本數據位數/8 |
20H ~ 21H | 2 | int | DATA數據塊的調整數(字節),其值為:通道數*樣本數據位數/8 |
22H ~ 23H | 2 | int | 樣本數據位數,0010H即16,代表一個量化兩本占2字節 |
24H ~ 27H | 4 | char | "data", data數據塊標志,固定不變 |
28H ~ 2BH | 4 | long | wav文件音頻數據所占大小 |
2CH ~ ... | ... | 真正存儲的音頻數據(不屬於文件頭了) |
上面是一般wav文件的文件頭數據,而通過ffmpeg轉碼的wav文件於此有些差距,在格式塊和數據頭塊之間添加了一些ffmpeg的信息,如下圖。
偏移地址 | 字節數 | 數據類型 | 內容 |
00H ~ 23H | 36 | 同上表的00H~23H一致 | |
24H ~ 27H | 4 | char | "LIST", LIST塊標志,固定不變 |
28H ~ 2BH | 4 | long | LIST塊占用的字節數,在這里為26字節 |
2CH ~ 45H | 26 | LIST塊內容 | |
46H ~ 49H | 4 | char | "data", data數據塊標志,固定不變 |
4AH ~ 4DH | 4 | long | wav文件音頻數據所占大小 |
ffmpeg處理命令
1. 將格式不正確的wav文件轉碼為ffmpeg格式的wav文件:
ffmpeg -i "sourceFile" -y "targetFile"
2. 將mp3文件轉碼為ffmpeg格式的wav文件(編碼格式為16PCM、小端模式):
ffmpeg -i "sourceFile" -acodec pcm_s16le -y "targetFile"
3. 音頻切割:
ffmpeg -i "sourceFile" -ss startTime -to endTime -y "targetFile"(按起點和終點切割)
ffpmeg -i "sourceFile" -ss startTime -t duration -y "targetFile"(按起點和持續時間切割)
參考文章
1. WAV文件格式
2. wav文件詳解
3. wav文件格式分析