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文件格式分析