WAV文件格式解析

版权声明:我的Github博客:https://wintrysec.github.io https://blog.csdn.net/qq_35553433/article/details/86550320

WAV格式简介

WAVE(Waveform Audio File Format)是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。

                                                                                      波形文件(.wav)文件头示例

文件头中的关键值包括

音频类型:WAVE

调制方法:以PCM为例(脉冲编码调制)

声道个数:2,大多数音频文件都有两个声道

采样频率:每个声道44 100 (根据奈奎斯特定理,每次采样使用的字节数和位数)

头文件下方是连续的数据信息,而数据长度是规定好的4字节的16进制数 04-5C-67-00

推导每个声道的采样值:

(1)大小端序转换

交换 04-5C-67-00 的字节和字,将小端序转换成大端序;

得到实际长度为 00-67-5C-04(16进制)-> 6 737 476(十进制)

(2)双声道分解

因为音频又两个声道,所以把上边的结果除以2,得每个声道 3 386 882个字节。

每个记录样本大小位16位(2字节)

因此每个声道得采样值为:1 693 441。

此外,例如音频时长38s,可用38s x 44 100 样例/s,求得采样值(精度不准)

格式解析

WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。

WAV文件一般由3个区块组成:RIFF chunkFormat chunkData chunk

另外,文件中还可能包含一些可选的区块,如:Fact chunkCue points chunkPlaylist chunkAssociated data list chunk等。

RIFF区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'RIFF' (0x52494646)
Size 0x04 4Byte 小端 fileSize - 8
Type 0x08 4Byte 大端 'WAVE'(0x57415645)
  • 'RIFF'为标识
  • Size是整个文件的长度减去IDSize的长度
  • TypeWAVE表示后面需要两个子块:Format区块和Data区块

FORMAT区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'fmt ' (0x666D7420)
Size 0x04 4Byte 小端 16
AudioFormat 0x08 2Byte 小端 音频格式
NumChannels 0x0A 2Byte 小端 声道数
SampleRate 0x0C 4Byte 小端 采样率
ByteRate 0x10 4Byte 小端 每秒数据字节数
BlockAlign 0x14 2Byte 小端 数据块对齐
BitsPerSample 0x16 2Byte 小端 采样位数
  • 'fmt '为标识
  • Size表示该区块数据的长度(不包含IDSize的长度)
  • AudioFormat表示Data区块存储的音频数据的格式,PCM音频数据的值为1
  • NumChannels表示音频数据的声道数,1:单声道,2:双声道
  • SampleRate表示音频数据的采样率
  • ByteRate每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
  • BlockAlign每个采样所需的字节数 = NumChannels * BitsPerSample / 8
  • BitsPerSample每个采样存储的bit数,8:8bit,16:16bit,32:32bit

DATA区块

名称 偏移地址 字节数 端序 内容
ID 0x00 4Byte 大端 'data' (0x64617461)
Size 0x04 4Byte 小端 N
Data 0x08 NByte 小端 音频数据
  • 'data'为标识
  • Size表示音频数据的长度,N = ByteRate * seconds
  • Data音频数据

小端存储

WAV文件以小端形式来进行数据存储。

大端模式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端模式:数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

PCM数据在WAV文件中的bit位排列方式

PCM数据类型 采样 采样
8Bit 单声道 声道0 声道0
8Bit 双声道 声道0 声道1
16Bit 单声道 声道0低位,声道0高位 声道0低位,声道0高位
16Bit 双声道 声道0低位,声道0高位 声道1低位,声道1高位

猜你喜欢

转载自blog.csdn.net/qq_35553433/article/details/86550320