WAV文件格式

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,定义音频数据。

    OffsetSizeDespriptionValue
    0x004Chunk ID"RIFF"(0x52494646)
    0x044Chunk Data Size(file size )-8
    0x084RIFF Type"WAVE"(0x57415645)
    0x10wave chunks
    有多种类型的chunks可用于描述wave 文件,其中最常用的是Format  Chunk和Data Chunk(Format Chunk通常置于Data Chunk之前)。

    Chunk Data Size:整个文件的大小,以字节为单位减去Chunk ID和Chunk Data Size所占的8的字节或

    4 + (8 + Format Size) + (8 + Data Size)
    



    Format Chunk - "fmt":描述WAV文件中音频数据的存储方式,压缩方式,通道数,采样率,(样值的)量化比特数等信息

    OffsetSizeDescriptionValue
    0x004Chunk ID"fmt"(0x666D7420)
    0x044Chunk Data Size16+extra format bytes
    0x082Compression Code1 - 65535
    0x0a2Number of Channels1 - 65535
    0x0c4Sample rate1 - 0xFFFFFFFF
    0x104Byte rate1 - 0xFFFFFFFF
    0x142Block align 1 - 65535
    0x162Bits per sample2 - 65535
    0x182Extra format bytes0 - 65535
    0x1aEXtra format bytes
    chunk ID:通常是"fmt",如果不包含未压缩的数据,Chunk ID的字符串以空格(0x20)结尾。

    Data Size:是标准WAVE文件(16比特量化)的数据与特殊WAVE文件所需的特定字节之和,有16,18或40

    Compression Code:表明wave chunk中数据的压缩方式:

    CodeDescription
    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 PCM176.41292
    8,000 Hz 16 bit PCM128938
    11,025 Hz 8 bit PCM88.2646
    11,025 Hz µ-Law88.2646
    8,000 Hz 8 bit PCM64469
    8,000 Hz µ-Law64469
    11,025 Hz 4 bit ADPCM44.1323
    8,000 Hz 4 bit ADPCM32234

    实例:


    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)中也可包含数据块,且可包含多个(被压缩后的数据)

    OffsetLengthTypeDescriptionValue
    0x004Char[4]Chunk ID"data"(0x64617461)
    0x044DWORDChunk Size取决于样本长度和压缩样本数
    0x08 
    Chunk Size:数据块大小,计算公式:

    NumSamples * NumChannels * BitsPerSample/8
    实例:

                                           

    多通道数字音频数据以隔行方式存储,在每个采样周期内通过循环遍历每个通道的采样数据,以保证在全部数据被读取完成之前便可播放文件,这使得在播放大音频文件或在网络上播放时十分方便。

    音频数据在data chunk中的存储顺序为:

    TimeChannelValue
    01(left)
    2(right)
    0x0053
    0x0024
    11(left)
    2(right)
    0x0057
    0x0029
    除此之外还有Fact Chunk,Cue Chunk,Playlist  Chunk,和Associated Data List  Chunk等

    综上,WAV文件的结构为:





    Chunk ID "RIFF"
    Chunk Data size
     
    RIFF Type ID "WAVE"


    Chunk ID "fmt"
    Chunk Data size
     
    Sample Format Info


    Chunk ID "data"
    Chunk Data size
     
    Digital 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值