申明:本博客所有标注为原创的文章均为本人原创,非商业目的转载和摘录请注明链接地址,如需商业用途请与本人联系。
WAV是由微软和IBM联合开发的一种音频数字编码格式,它采用RIFF文件格式结构(Resource Interchange File Format,RIFF),RIFF是一种树形文件结构,它是由一个表头(header)跟随着多个区块(chunks)所组成,简单来说,wav文件 == 音频信息 + 音频数据。wav 文件本身可以包含各种编码格式,一般由3个文件区块构成:RIFF Chunk,Format Chunk,Data Chunk。另外还可能包含以下不常见的区块:Fact Chunk,Cue Chunk,Playlist Chunk,Associated Data List Chunk,Label Chunk,Labeled Text Chunk,Note Chunk,Sample Chunk,Instrument Chunk.。
RIFF基本文件结构:
表头(Header):
大小 | 含义 |
4 Byte | Chunk ID |
4 Byte | Chunk Data Size |
Chunk Data Size | Chunk Data Bytes |
区块(Chunks):
大小 | 含义 |
4 Byte | Chunk ID |
4 Byte | Chunk Data Size |
Chunk Data Size | Chunk Data Bytes (长度不为偶数,则填入一个byte) |
wav文件结构:
|
RIFF区块:
名称 | 偏移 | 大小 | 数值 | 含义 |
ChunkID | 0x00 | 4Byte | 'RIFF' (0x52494646) | 'RIFF' |
ChunkSize | 0x04 | 4Byte | (file size) - 8 | Chunk Data Size |
Type | 0x08 | 4Byte | 'WAVE'(0x57415645) | 'WAVE' |
| 0x10 | Chunk Data Size |
| Wave chunks |
RIFF区块:主要用于识别当前文件格式是否为wav音频文件。
Format区块:
名称 | 偏移 | 大小 | 数值 | 含义 |
ChunkID | 0x00 | 4 Byte | 'fmt ' (0x666D7420) | "fmt " |
ChunkSize | 0x04 | 4 Byte | 16,18 | 18则最后又附加信息 |
AudioFormat | 0x08 | 2 Byte | 1 - 65,535 | 编码方式 |
NumChannels | 0x0a | 2 Byte | 1,2 | 声道数目 |
SampleRate | 0x0c | 4 Byte | 8000, 44100, 48000 | 采样频率 |
ByteRate | 0x10 | 4 Byte | SampleRate*NumChannels*BitsPerSample/8 | 每秒所需字节数 |
BlockAlign | 0x14 | 2 Byte | NumChannels * BitsPerSample/8 | 数据块对齐 |
BitsPerSample | 0x16 | 2 Byte | 8 bits = 8, 16 bits = 16 | 采样位数 |
ExtraParamSize | 0x18 | 2 Byte |
| 附加信息 |
ExtraParams | 0x1a |
|
| 附加信息 |
Format 区块:包含了描述wav文件中的许多重要信息:编码方式,声道数目,采样频率,采样位数等。
AudioFormat (编码方式): wav文件格式本身可以包含多种音频编码格式,最常见的是PCM编码格式,它是一种不经过压缩算法处理的格式,同时wav文件中也可能是其他压缩编码格式,判断wav文件中的编码格式必须要通过这里的“AudioFormat”。
格式 | 数值 |
WAVE_FORMAT_UNKNOWN | 0x0000 |
WAVE_FORMAT_PCM | 0x0001 |
WAVE_FORMAT_ADPCM | 0x0002 |
WAVE_FORMAT_IEEE_FLOAT | 0x0003 |
WAVE_FORMAT_VSELP | 0x0004 |
WAVE_FORMAT_IBM_CVSD | 0x0005 |
WAVE_FORMAT_ALAW | 0x0006 |
WAVE_FORMAT_MULAW | 0x0007 |
WAVE_FORMAT_DTS | 0x0008 |
WAVE_FORMAT_DRM | 0x0009 |
WAVE_FORMAT_OKI_ADPCM | 0x0010 |
WAVE_FORMAT_DVI_ADPCM | 0x0011 |
WAVE_FORMAT_IMA_ADPCM | 0x0011 |
WAVE_FORMAT_MEDIASPACE_ADPCM | 0x0012 |
WAVE_FORMAT_SIERRA_ADPCM | 0x0013 |
WAVE_FORMAT_G723_ADPCM | 0x0014 |
WAVE_FORMAT_DIGISTD | 0x0015 |
WAVE_FORMAT_DIGIFIX | 0x0016 |
WAVE_FORMAT_DIALOGIC_OKI_ADPCM | 0x0017 |
WAVE_FORMAT_MEDIAVISION_ADPCM | 0x0018 |
WAVE_FORMAT_CU_CODEC | 0x0019 |
WAVE_FORMAT_YAMAHA_ADPCM | 0x0020 |
WAVE_FORMAT_SONARC | 0x0021 |
WAVE_FORMAT_DSPGROUP_TRUESPEECH | 0x0022 |
WAVE_FORMAT_ECHOSC1 | 0x0023 |
WAVE_FORMAT_AUDIOFILE_AF36 | 0x0024 |
WAVE_FORMAT_APTX | 0x0025 |
WAVE_FORMAT_AUDIOFILE_AF10 | 0x0026 |
WAVE_FORMAT_PROSODY_1612 | 0x0027 |
WAVE_FORMAT_LRC | 0x0028 |
WAVE_FORMAT_DOLBY_AC2 | 0x0030 |
WAVE_FORMAT_GSM610 | 0x0031 |
WAVE_FORMAT_MSNAUDIO | 0x0032 |
WAVE_FORMAT_ANTEX_ADPCME | 0x0033 |
WAVE_FORMAT_CONTROL_RES_VQLPC | 0x0034 |
WAVE_FORMAT_DIGIREAL | 0x0035 |
WAVE_FORMAT_DIGIADPCM | 0x0036 |
WAVE_FORMAT_CONTROL_RES_CR10 | 0x0037 |
WAVE_FORMAT_NMS_VBXADPCM | 0x0038 |
WAVE_FORMAT_CS_IMAADPCM | 0x0039 |
WAVE_FORMAT_ECHOSC3 | 0x003A |
WAVE_FORMAT_ROCKWELL_ADPCM | 0x003B |
WAVE_FORMAT_ROCKWELL_DIGITALK | 0x003C |
WAVE_FORMAT_XEBEC | 0x003D |
WAVE_FORMAT_G721_ADPCM | 0x0040 |
WAVE_FORMAT_G728_CELP | 0x0041 |
WAVE_FORMAT_MSG723 | 0x0042 |
WAVE_FORMAT_MPEG | 0x0050 |
WAVE_FORMAT_RT24 | 0x0052 |
WAVE_FORMAT_PAC | 0x0053 |
WAVE_FORMAT_MPEGLAYER3 | 0x0055 |
WAVE_FORMAT_LUCENT_G723 | 0x0059 |
WAVE_FORMAT_CIRRUS | 0x0060 |
WAVE_FORMAT_ESPCM | 0x0061 |
WAVE_FORMAT_VOXWARE | 0x0062 |
WAVE_FORMAT_CANOPUS_ATRAC | 0x0063 |
WAVE_FORMAT_G726_ADPCM | 0x0064 |
WAVE_FORMAT_G722_ADPCM | 0x0065 |
WAVE_FORMAT_DSAT_DISPLAY | 0x0067 |
WAVE_FORMAT_VOXWARE_BYTE_ALIGNED | 0x0069 |
WAVE_FORMAT_VOXWARE_AC8 | 0x0070 |
WAVE_FORMAT_VOXWARE_AC10 | 0x0071 |
WAVE_FORMAT_VOXWARE_AC16 | 0x0072 |
WAVE_FORMAT_VOXWARE_AC20 | 0x0073 |
WAVE_FORMAT_VOXWARE_RT24 | 0x0074 |
WAVE_FORMAT_VOXWARE_RT29 | 0x0075 |
WAVE_FORMAT_VOXWARE_RT29HW | 0x0076 |
WAVE_FORMAT_VOXWARE_VR12 | 0x0077 |
WAVE_FORMAT_VOXWARE_VR18 | 0x0078 |
WAVE_FORMAT_VOXWARE_TQ40 | 0x0079 |
WAVE_FORMAT_SOFTSOUND | 0x0080 |
WAVE_FORMAT_VOXWARE_TQ60 | 0x0081 |
WAVE_FORMAT_MSRT24 | 0x0082 |
WAVE_FORMAT_G729A | 0x0083 |
WAVE_FORMAT_MVI_MVI2 | 0x0084 |
WAVE_FORMAT_DF_G726 | 0x0085 |
WAVE_FORMAT_DF_GSM610 | 0x0086 |
WAVE_FORMAT_ISIAUDIO | 0x0088 |
WAVE_FORMAT_ONLIVE | 0x0089 |
WAVE_FORMAT_SBC24 | 0x0091 |
WAVE_FORMAT_DOLBY_AC3_SPDIF | 0x0092 |
WAVE_FORMAT_MEDIASONIC_G723 | 0x0093 |
WAVE_FORMAT_PROSODY_8KBPS | 0x0094 |
WAVE_FORMAT_ZYXEL_ADPCM | 0x0097 |
WAVE_FORMAT_PHILIPS_LPCBB | 0x0098 |
WAVE_FORMAT_PACKED | 0x0099 |
WAVE_FORMAT_MALDEN_PHONYTALK | 0x00A0 |
WAVE_FORMAT_RHETOREX_ADPCM | 0x0100 |
WAVE_FORMAT_IRAT | 0x0101 |
WAVE_FORMAT_VIVO_G723 | 0x0111 |
WAVE_FORMAT_VIVO_SIREN | 0x0112 |
WAVE_FORMAT_DIGITAL_G723 | 0x0123 |
WAVE_FORMAT_SANYO_LD_ADPCM | 0x0125 |
WAVE_FORMAT_SIPROLAB_ACEPLNET | 0x0130 |
WAVE_FORMAT_SIPROLAB_ACELP4800 | 0x0131 |
WAVE_FORMAT_SIPROLAB_ACELP8V3 | 0x0132 |
WAVE_FORMAT_SIPROLAB_G729 | 0x0133 |
WAVE_FORMAT_SIPROLAB_G729A | 0x0134 |
WAVE_FORMAT_SIPROLAB_KELVIN | 0x0135 |
WAVE_FORMAT_G726ADPCM | 0x0140 |
WAVE_FORMAT_QUALCOMM_PUREVOICE | 0x0150 |
WAVE_FORMAT_QUALCOMM_HALFRATE | 0x0151 |
WAVE_FORMAT_TUBGSM | 0x0155 |
WAVE_FORMAT_MSAUDIO1 | 0x0160 |
WAVE_FORMAT_UNISYS_NAP_ADPCM | 0x0170 |
WAVE_FORMAT_UNISYS_NAP_ULAW | 0x0171 |
WAVE_FORMAT_UNISYS_NAP_ALAW | 0x0172 |
WAVE_FORMAT_UNISYS_NAP_16K | 0x0173 |
WAVE_FORMAT_CREATIVE_ADPCM | 0x0200 |
WAVE_FORMAT_CREATIVE_FASTSPEECH8 | 0x0202 |
WAVE_FORMAT_CREATIVE_FASTSPEECH10 | 0x0203 |
WAVE_FORMAT_UHER_ADPCM | 0x0210 |
WAVE_FORMAT_QUARTERDECK | 0x0220 |
WAVE_FORMAT_ILINK_VC | 0x0230 |
WAVE_FORMAT_RAW_SPORT | 0x0240 |
WAVE_FORMAT_ESST_AC3 | 0x0241 |
WAVE_FORMAT_IPI_HSX | 0x0250 |
WAVE_FORMAT_IPI_RPELP | 0x0251 |
WAVE_FORMAT_CS2 | 0x0260 |
WAVE_FORMAT_SONY_SCX | 0x0270 |
WAVE_FORMAT_FM_TOWNS_SND | 0x0300 |
WAVE_FORMAT_BTV_DIGITAL | 0x0400 |
WAVE_FORMAT_QDESIGN_MUSIC | 0x0450 |
WAVE_FORMAT_VME_VMPCM | 0x0680 |
WAVE_FORMAT_TPC | 0x0681 |
WAVE_FORMAT_OLIGSM | 0x1000 |
WAVE_FORMAT_OLIADPCM | 0x1001 |
WAVE_FORMAT_OLICELP | 0x1002 |
WAVE_FORMAT_OLISBC | 0x1003 |
WAVE_FORMAT_OLIOPR | 0x1004 |
WAVE_FORMAT_LH_CODEC | 0x1100 |
WAVE_FORMAT_NORRIS | 0x1400 |
WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS | 0x1500 |
WAVE_FORMAT_DVM | 0x2000 |
Channels(声道数):常见的有1(单声道),2(立体声)。
Sample Rate(采样频率):是指录音设备在一秒钟内对声音信号进行采样次数。一般为44100HZ, 48000HZ等。
BitsPerSample(采样位数):是指该声音信号保存时所用的二进制位数。一般为8 位, 16 位。
Fact区块:(可选)
名称 | 偏移 | 大小 | 数值 | 含义 |
Chunk ID | 0x00 | 4 Bytes | 'fact' |
|
Chunk Size | 0x04 | 4 Bytes | 4 |
|
Chunk Data | 0x08 | 4 Bytes |
|
|
Fact 区块:如果音频数据为PCM格式时(即AudioFormat值为1),则不存在此区块。
Data区块:
名称 | 偏移 | 大小 | 数值 | 含义 |
Chunk ID | 0x00 | 4Byte | 'data' (0x64617461) |
|
Chunk Size | 0x04 | 4Byte | Data size | 音频数据大小 |
Sound Data | 0x08 | 2Byte | sample data | 音频数据起始 |
Data区块:保存了音频数据大小和音频数据。
PCM音频数据排列方式:
| 样本1 | 样本2 | ||
8位单声道 | 0声道 | 0声道 | ||
8位立体声 | 0声道(左) | 1声道(右) | 0声道(左) | 1声道(右) |
16位单声道 | 0声道 低字节 | 0声道 高字节 | 0声道 低字节 | 0声道 高字节 |
16位立体声 | 0声道(左) 低字节 | 0声道(左) 高字节 | 1声道(右) 低字节 | 1声道(右) 高字节 |
参考链接:
http://www.sonicspot.com/guide/wavefiles.html
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
附件(参考资料):