wav简介

本文详细介绍了WAV音频文件的格式,包括其基于RIFF规范的结构,如FOURCC、Chunk和SubChunk的概念。WAV文件头部的44字节详细解析了采样率、通道数、位深等信息,以及如何判断和处理包含附加信息的WAV文件。此外,还讨论了如何动态计算PCM音频数据的开始位置。
摘要由CSDN通过智能技术生成

        wav是经典的Windows音频封装格式,数据本身格式一般为pcm,也支持一些编码格式数据,如aac编码。格式为文件头+数据形式,如果是pcm数据,则文件大小filesize=headsize+timeInSecond * sampleRate*channels*bitsPerSample/8。Wav格式遵循RIFF规范。RIFF,全称Resource Interchange File Format,是一种按照标记区块存储数据的通用文件存储格式,多用于存储音频、视频等多媒体数据。Microsoft在Windows下的WAV、AVI等都是基于RIFF实现的。

一个标准的RIFF规范规范文件,最小存储单位为“块”(Chunk),每个块(Chunk)包含以下三个信息:

名称

大小

类型

端序

含义

FOURCC

4

char

大端

用于标识chunk ID或chunk类型

Data Field Size

4

int

小端

标识数据的大小不包含FOURCC与本身的大小

Data Filed

数据域,如果chunk ID为”RIFF”或”LIST”,则开始4个字节为类型码

    只有ID为"RIFF"或者"LIST"的块允许拥有子块(SubChunk)。RIFF文件的第一个块的ID必须是"RIFF",也就是说ID为"LIST"的块只能是子块(SubChunk),他们和各个子块形成了复杂的RIFF文件结构。

  RIFF数据域的的起始位置四个字节为类型码(Form Type),用于说明数据域的格式,比如WAV文件的类型码为"WAVE"。

  "LIST"块的数据域的起始位置也有一个四字节类型码(List Type),用于说明LIST数据域的数据内容。比如,类型码为"INFO"时,其数据域可能包括"ICOP"、"ICRD"块,用于记录文件版权和创建时间信息。

以最简单的无损WAV格式文件为例,此时文件的音频数据部分为PCM,比较简单,重点在于WAV头部。一个典型的WAV文件头部长度为44字节,包含了采样率,通道数,位深等信息,如下表所示

偏移位置

大小

类型

端序

含义

0x00-0x03

4

char

大端

"RIFF"(0x52494646),标记为RIFF文件格式

0x04-0x07

4

int

小端

块数据域大小(Chunk Size),即从下一个地址开始,到文件末尾的总字节数,或者文件总字节数-8。从0x08开始一直到文件末尾,都是ID为"RIFF"块的内容,其中会包含两个子块,"fmt "和"data"

0x08-0x0B

4

char

大端

类型码(Form Type),WAV文件格式标记,即"WAVE"四个字母

0x0C-0x0F

4

char

大端

"fmt "子块(0x666D7420),注意末尾的空格

0x10-0x13

4

int

小端

子块数据域大小(SubChunk Size)

0x14-0x15

2

int

小端

编码格式(Audio Format),1代表PCM无损格式

0x16-0x17

2

int

小端

声道数(Channels),1或2

0x18-0x1B

4

int

小端

采样率(Sample Rate)

0x1C-0x1F

4

int

小端

传输速率(Byte Rate),每秒数据字节数,SampleRate * Channels * BitsPerSample / 8

0x20-0x21

2

int

小端

每个采样所需的字节数BlockAlign,BitsPerSample*Channels/8

0x22-0x23

2

int

小端

单个采样位深(Bits Per Sample),可选8、16或32

0x24-0x27

4

char

大端

"data"子块 (0x64617461)

0x28-0x2B

4

int

小端

子块数据域大小(SubChunk Size)

0x2C-eos

n

PCM

上表为典型的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,并且紧随是另一个子块。

如果一个无损WAV文件头部包含了附加信息,那么PCM音频所在的位置就不确定了,但由于附加信息也是一个子块(SubChunk),根据RIFF规范,该子块也必然记录着其长度信息,所以我们还是有办法能够动态计算出其位置,下面是计算步骤:

  1. 判断fmt块长度是否为18。
  2. 如果fmt长度为18,那么必然从0x26位置开始为附加信息块,0x30-0x33位置记录着该子块长度。
  3. 根据步骤2获取的子块长度,假定为N(16进制),那么PCM音频信息开始位置为:0x34 + N + 8。

原文地址:史上全最的WAV格式详解 - 简书

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值