WAV File(1)
是存储音频比特流的本地文件格式,由Microsoft和IBM联合开发,应用资源交换文件格式(RIFF)组织数据,将其存储在块(chunk)中,是Windows上原始和未压缩音频数据的主流格式。
WAV 文件多数情况下是以线性脉冲编码调制(PCM)方式的未压缩文件。PCM方式保留了音轨的所有样本,使得WAV文件有较高的音频质量。同时WAV文件支持压缩音频,可使用任意的ACM编解码器压缩WAV文件。
RIFF (Resource Interchange File Format)
是一种标记文件格式(tagged file format),可以看做是一个特殊的容器( container),其通用格式是:
- 4字节:此块的ASCII标识符
- 4字节:块长度(除此字段本身和块标识符,且填充字节不计入块的大小)
- 大小可变字段:块数据
- padding字节:填充块数据(因为块数据必须是字对齐(Word aligned)的,即总的长度必须是2的倍数)
RIFF格式的优点:可拓展成不同类型的文件而不至引起混淆
允许程序不必识特定的块且可以跳过这些块去处理后续的数据(RIFF的读取规则:忽略不能识别的 带有标记的块)
并且某些特定的块中还可以包括子块(sub chunks),如WAV文件中的Wave List Chunk--"wavl"(用于指定几个交替的静音块(slnt)和数据块("data"))。
WAV文件中的块:
1.Wave File Header - RIFF Type Chunk
按照标准的RIFF文件格式定义,起始的8字节是标准的RIFF文件块标题,标识符"RIFF"和块大小,紧随的4字节定义RIFF块中的资源类型,在WAV文件中即为"WAVE(0x57415645)",类型定义之后是wave chunks,定义音频数据。
有多种类型的chunks可用于描述wave 文件,其中最常用的是Format Chunk和Data Chunk(Format Chunk通常置于Data Chunk之前)。Offset Size Despription Value 0x00 4 Chunk ID "RIFF"(0x52494646) 0x04 4 Chunk Data Size (file size )-8 0x08 4 RIFF Type "WAVE"(0x57415645) 0x10 wave chunks Chunk Data Size:整个文件的大小,以字节为单位减去Chunk ID和Chunk Data Size所占的8的字节或
4 + (8 + Format Size) + (8 + Data Size)
Format Chunk - "fmt":描述WAV文件中音频数据的存储方式,压缩方式,通道数,采样率,(样值的)量化比特数等信息
chunk ID:通常是"fmt",如果不包含未压缩的数据,Chunk ID的字符串以空格(0x20)结尾。Offset Size Description Value 0x00 4 Chunk ID "fmt"(0x666D7420) 0x04 4 Chunk Data Size 16+extra format bytes 0x08 2 Compression Code 1 - 65535 0x0a 2 Number of Channels 1 - 65535 0x0c 4 Sample rate 1 - 0xFFFFFFFF 0x10 4 Byte rate 1 - 0xFFFFFFFF 0x14 2 Block align 1 - 65535 0x16 2 Bits per sample 2 - 65535 0x18 2 Extra format bytes 0 - 65535 0x1a EXtra format bytes Data Size:是标准WAVE文件(16比特量化)的数据与特殊WAVE文件所需的特定字节之和,有16,18或40
Compression Code:表明wave chunk中数据的压缩方式:
采用不同压缩编码格式的音频比特率之间的比较:Code Description 0(0x000000) Unknown 1(0x0001) PCM/uncompressed 2(0x0002) Mocrosoft ADPCM 6(0x0006) ITU G.711 a-law 7(0x0007) ITU G.711 Âμ-law 17(0x0011) IMA ADPCM 22(0x0016) ITU G.273 ADPCM(Yamaha) 49(0x0031) GSM 6.10 64(0x0040) ITU G.271 ADPCM 80(0x0050) MPEG 65534(0xFFFE) Determined by SubFormat 65535(0xFFFF) Experimental 格式 比特率(kbit/s) 每分钟数据量(iB) 11,025 Hz 16 bit PCM 176.4 1292 8,000 Hz 16 bit PCM 128 938 11,025 Hz 8 bit PCM 88.2 646 11,025 Hz µ-Law 88.2 646 8,000 Hz 8 bit PCM 64 469 8,000 Hz µ-Law 64 469 11,025 Hz 4 bit ADPCM 44.1 323 8,000 Hz 4 bit ADPCM 32 234 实例:
0x00 06:A-law压缩方法,此时Format chunk中要有Extra Foemat Bytes以包含解码所需的信息,fmt块(标识符 0x)的大小也变为18(0x00000012)字节,此时data块的前面还要加入存储压缩码信息的Fact chunk (详见Fact chunk)
此例中采用μ-law(0x0007)压缩方法,Format chunk中同样含有Extra Foemat Bytes以包含解码所需的信息,fmt块(标识符 0x)的大小也为18(0x00000012)字节,在data块之前也有fact块。
此例中通道数为8,采样率为48kHz,压缩方式为0x FF FE(WAVE_FORMAT_EXTENSIBLE,主要用于定义多于2通道和高采样率的WAVE文件的编码方式),同时在data块之前含有cue块(详见Cue Chunk)
Number of channels:通道数,即在chunk中编码传输的音频信号的路数:mono signal和stereo signal WAVE_FORMAT_EXTENSIBLE,主要用于定义多于2通道和高采样率的WEVE文件的编码方式
实例:
mono - 16bit
stereo - 16bit
0x66 6D 74 20:表示标识符"fmt"
0x00 00 00 10:"fmt"块的大小:16字节(PCM)
0x00 01:压缩方式:PCM
0x00 02:通道数2(stereo)
0x00 00 AC 44:采样率 44.1KHz
0x00 02 81 10:字节速率:176400
0x00 04:一个样本的字节数:4
0x00 10:量化比特数:16
6通道
Sample rate:采样率,与通道数无关。常用采样频率:CD:44.1kHz DAT tapes:48kHz
Byte rate:每秒要传输到D/A转化器的字节数,决定了数据是否可以从源以足够高的速率传输以保证持续的播放,计算公式: Sample Rate*Block Align
Block Align:每个样本的字节数 计算公式:BitsPerSample / 8 *Num channels
Bits per Sample:指定用于定义每个样本的比特数 ,通常为8、16、24、32,如果不是8的倍数,就以离8的倍数最近的数为准,未使用的字节设置为0
8比特样值为无符号数0~255,其余为有符号数,如16比特的样值范围:-32768 - 32767
Extra Foemat Bytes:与解码时需要的信息有关,如果压缩方式为0,此部分为空,且此部分也需要字对齐(Word aligned)
Data Chunk - "data"
包含使用format Chunk 中定义的编码方式编码的数据(compression code为1时,指未压缩的原始音频数据)
Wave List Chunk(wavl)中也可包含数据块,且可包含多个(被压缩后的数据)
Chunk Size:数据块大小,计算公式:Offset Length Type Description Value 0x00 4 Char[4] Chunk ID "data"(0x64617461) 0x04 4 DWORD Chunk Size 取决于样本长度和压缩样本数 0x08 NumSamples * NumChannels * BitsPerSample/8
实例:
多通道数字音频数据以隔行方式存储,在每个采样周期内通过循环遍历每个通道的采样数据,以保证在全部数据被读取完成之前便可播放文件,这使得在播放大音频文件或在网络上播放时十分方便。
音频数据在data chunk中的存储顺序为:
除此之外还有Fact Chunk,Cue Chunk,Playlist Chunk,和Associated Data List Chunk等Time Channel Value 0 1(left)
2(right)0x0053
0x00241 1(left)
2(right)0x0057
0x0029综上,WAV文件的结构为:
Chunk ID "RIFF"
Chunk Data sizeRIFF Type ID "WAVE"
Chunk ID "fmt"
Chunk Data sizeSample Format Info
Chunk ID "data"
Chunk Data sizeDigital Audio Samples
尽管未压缩的WAV文件很大,但其广泛用于存储高质量的原始数据,WAV文件结构简单。一些使用无磁带系统的广播电台也会使用WAV文件,并且世界数字无线电联盟将WAV文件作为发射机仿真和接收机测试的非正式标准由于WAV文件的采样率在1-4.3GHz之间变化,并且声道数最多可达65535路,因此WAV文件也可用于非音频文件。
局限性:由于使用32比特的无符号整数记录文件头,WAV文件的大小限于4GB(部分则限于2GB),
参考资料:https://en.wikipedia.org/wiki/WAV
https://en.wikipedia.org/wiki/Resource_Interchange_File_Format
http://soundfile.sapp.org/doc/WaveFormat/
http://www.topherlee.com/software/pcm-tut-wavformat.html
http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
多类型WAV文件下载:
http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html