宁波网站推广专业服务,四川省建设厅官方网站扣分记录,慧聪网官网首页,网站建设的运营计划概述
WAV即WAVE#xff0c;是经典的Windows音频数据封装格式#xff0c;由Microsoft开发。数据本身格式为PCM#xff0c;也可以支持一些编码格式的数据#xff0c;比如最近流行的AAC编码。如果是PCM#xff0c;则为无损格式#xff0c;文件会比较大#xff0c;并且大小…概述
WAV即WAVE是经典的Windows音频数据封装格式由Microsoft开发。数据本身格式为PCM也可以支持一些编码格式的数据比如最近流行的AAC编码。如果是PCM则为无损格式文件会比较大并且大小相对固定可以使用以下公式计算文件大小。
FileSize HeadSize TimeInSecond * SampleRate * Channels * BitsPerSample / 8其中HeadSize为WAV文件头部长度SampleRate即采样率可选8000、16000、32000、44100或48000Channels表示声道数量通常为1或2BitsPerSample代表单个Sample的位深可选8、16以及32其中32位时可以是float类型。 WAV是一种极其简单的文件格式如果对其结构足够熟悉完全可以自己通过代码写入WAV文件从而免去引入一些复杂中间库。特别是在对音频进行调试的时候能提高效率降低复杂度。 WAV格式遵循RIFF规范所有WAV都有一个文件头记录着音频流的采样和编码信息。数据块的记录方式是小尾端(little-endian)。
RIFF
RIFF全称Resource Interchange File Format是一种按照标记区块存储数据的通用文件存储格式多用于存储音频、视频等多媒体数据。Microsoft在Windows下的WAV、AVI等都是基于RIFF实现的。 一个标准的RIFF规范规范文件最小存储单位为“块”(Chunk)每个块(Chunk)包含以下三个信息
名称大小类型端序含义FOURCC4字符大端用于标识Chunk ID或chunk 类型通常为Chunk IDData Field Size4整形小端特别注意该长度不包含其本身以及FOURCCData Field---数据域如果Chunk ID为RIFF或LIST则开始四个字节为类型码
只有ID为RIFF或者LIST的块允许拥有子块(SubChunk)。RIFF文件的第一个块的ID必须是RIFF也就是说ID为LIST的块只能是子块(SubChunk)他们和各个子块形成了复杂的RIFF文件结构。 RIFF数据域的的起始位置四个字节为类型码(Form Type)用于说明数据域的格式比如WAV文件的类型码为WAVE。 “LIST块的数据域的起始位置也有一个四字节类型码(List Type)用于说明LIST数据域的数据内容。比如类型码为INFO时其数据域可能包括ICOP”、ICRD块用于记录文件版权和创建时间信息。
WAV
以最简单的无损WAV格式文件为例此时文件的音频数据部分为PCM比较简单重点在于WAV头部。一个典型的WAV文件头部长度为44字节包含了采样率通道数位深等信息如下表所示。
偏移位置大小类型端序含义0x00-0x034字符大端RIFF块(0x52494646)标记为RIFF文件格式0x04-0x074整型小端块数据域大小Chunk Size即从下一个地址开始到文件末尾的总字节数或者文件总字节数-8。从0x08开始一直到文件末尾都是ID为RIFF块的内容其中会包含两个子块fmt “和data”0x08-0x0B4字符大端类型码(Form Type)WAV文件格式标记即WAVE四个字母0x0C-0x0F4字符大端fmt 子块(0x666D7420)注意末尾的空格0x10-0x134整形小端子块数据域大小SubChunk Size0x14-0x152整形小端编码格式(Audio Format)1代表PCM无损格式0x16-0x172整形小端声道数(Channels)1或20x18-0x1B4整形小端采样率(Sample Rate)0x1C-0x1F4整形小端传输速率(Byte Rate)每秒数据字节数SampleRate * Channels * BitsPerSample / 80x20-0x212整形小端每个采样所需的字节数BlockAlignBitsPerSample*Channels/80x22-0x232整形小端单个采样位深(Bits Per Sample)可选8、16或320x24-0x274字符大端data子块 (0x64617461)0x28-0x2B4整形小端子块数据域大小SubChunk Size0x2C-eosNPCM
上表为典型的WAV头部格式从0x00到0x2B总共44字节从0x2C开始一直到文件末尾都是PCM音频数据。所以如果你已经知道了PCM的采样信息那么可以直接跳过头部的解析直接从0x2C开始读取PCM即可但是对于另一些无损的WAV文件却是不行的。
WAV扩展
有一些WAV的头部并不仅仅只有44个字节比如通过FFmpge编码而来的WAV文件头部信息通常大于44个字节。这是因为根据WAV规范其头部还支持携带附加信息所以只按照44个字节的长度去解析WAV头部信息是不一定正确的还需要考虑附加信息。那么如何知道一个WAV文件头部是否包含附加信息呢 根据fmt 子块长度来判断即可。 如果fmt SubChunk Size等于0x10(16)表示头部不包含附加信息即WAV头部信息长度为44如果等于0x12(18)则包含附加信息此时头部信息长度大于44。 当WAV头部包含附加信息时fmt SubChunk Size长度为18并且紧随是另一个子块这个包含了一些自定义的附加信息接着往下才是data子块格式如下
偏移位置大小类型端序含义0x00-0x034字符大端RIFF块(0x52494646)标记为RIFF文件格式0x04-0x074整型小端块数据域大小Chunk Size即从下一个地址开始到文件末尾的总字节数或者文件总字节数-8。从0x08开始一直到文件末尾都是ID为RIFF块的内容其中会包含两个子块fmt “和data”0x08-0x0B4字符大端类型码(Form Type)WAV文件格式标记即WAVE四个字母0x0C-0x0F4字符大端fmt 子块(0x666D7420)注意末尾的空格0x10-0x134整形小端子块数据域大小SubChunk Size这里为0x120x14-0x152整形小端编码格式(Audio Format)1代表PCM无损格式0x16-0x172整形小端声道数(Channels)1或20x18-0x1B4整形小端采样率(Sample Rate)0x1C-0x1F4整形小端传输速率(Byte Rate)每秒数据字节数SampleRate * Channels * BitsPerSample / 80x20-0x212整形小端每个采样所需的字节数BlockAlignBitsPerSample*Channels/80x22-0x232整形小端单个采样位深(Bits Per Sample)可选8、16或320x24-0x2520x26-不定---可选附加信息标准RIFF Chunk不定4字符大端data子块 (0x64617461)不定4整形小端子块数据域大小SubChunk Size不定NPCM
如果一个无损WAV文件头部包含了附加信息那么PCM音频所在的位置就不确定了但由于附加信息也是一个子块(SubChunk)根据RIFF规范该子块也必然记录着其长度信息所以我们还是有办法能够动态计算出其位置下面是计算步骤
判断fmt块长度是否为18。如果fmt长度为18那么必然从0x26位置开始为附加信息块0x30-0x33位置记录着该子块长度。根据步骤2获取的子块长度假定为N(16进制)那么PCM音频信息开始位置为0x34 N 8。 以上步骤仅为逻辑推理得出未经验证但大致遵循以上步骤如有错误欢迎指正。