wav文件頭詳解html
符合RIFF(Resource Interchange File Format)規範的wav文件的文件頭記錄了音頻流的編碼參數等基本信息。wav文件由多個塊組成,至少包含RIFF標誌塊、格式塊、數據頭塊和數據塊,全部數據均以小端模式存儲。(小端模式:按順序讀取時,先讀取的是數據的低位部分,後讀取的是數據的高位部分。如數據0x11, 0x00表明的是十六進制數0x0011,也就是3)。java
通常的wav文件頭由如下數據組成:post
偏移地址 | 字節數 | 數據類型 | 內容 |
00H ~ 03H | 4 | char | "RIFF", 資源交換文件RIFF標誌,固定不變 |
04H ~ 07H | 4 | long | 文件長度,從下個字節開始到文件結束的總字節數。編碼 計算結果爲文件大小(能夠從文件屬性中看)+8個字節(00H~07H)url |
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的信息,以下圖。spa
偏移地址 | 字節數 | 數據類型 | 內容 |
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處理命令.net
1. 將格式不正確的wav文件轉碼爲ffmpeg格式的wav文件:code
ffmpeg -i "sourceFile" -y "targetFile"orm
2. 將mp3文件轉碼爲ffmpeg格式的wav文件(編碼格式爲16PCM、小端模式):htm
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文件格式分析