WAV 文件解析

1.概述

wav 文件,原来存放音频的原始数据,即对 PCM 文件进行简单封装,在文件开头加上标识,并提供音频的声道数、采样频率和采样位数等信息,这样播放器解析这些数据就可以正常播放这段音频了。

2.格式解析

wav 文件一般由3个区块组成:RIFF chunk、Format chunk 和 Data chunk。
RIFF chunk:主要说明本文件保存的是什么内容。
Formt chunk:主要说明音频文件的格式
Data chunk:主要记录音频的数据

2.1 RIFF chunk

在这里插入图片描述
ID 固定死,填入 RIFF ,作为标识。
Size 为文件长度减去 ID 和 Size 的长度,即 fileSize - 8
Type 如果是 WAVE,表示后面有 Format chunk 和 Data chunk。

2.2 Format chunk

在这里插入图片描述
ID 固定死为 "fmt "(最后有个空格)
Size 表示该区块,后面内容的长度 2+2+4+4+2+2 = 16
AudioFormat 表示音频格式,如果是 PCM,则填入 1。(也可能是 -2,表示拓展格式,通过WAVEFORMATEXTENSIBLE 结构体 获取额外信息)
NumChannels 表示声道数
SampleRate 表示采样率
ByteRate 每秒数据字节数 SampleRateNumChannelsBitsPerSample/8
BlockAlign 每次采样产生的字节数 NumChannels*BitPerSample/8
BitsPerSample 一个声道一次采样的位数

2.3 Data chunk

在这里插入图片描述
ID 固定死为 data
Size 表示数据的长度(字节),N = ByteRate*seconds
Data 音频数据。

音频数据解析拓展

本处介绍的 wav 数据,默认内部存储的是 pcm数据,但是如何解析这个 pcm 数据呢?虽然前面格式里面保存了,每个采样的字节数,但是没有写是大端还是小端;数据是整数还是浮点;planar和packed?

  1. 大端还是小端:wav 默认规定了使用的是小端,所以这个没有歧义点。
  2. 数据是整数还是浮点:pcm 默认保存的是整数。微软官网默认 pcm 默认就是表示整数,如果是浮点数的 pcm,这 wav 格式为 WAVE_FORMAT_IEEE_FLOAT。

WAVE_FORMAT_PCM PCM (pulse-code modulated) data in integer format.
WAVE_FORMAT_IEEE_FLOAT PCM data in IEEE floating-point format.参考文献

  1. planar和packed:目前只查到wav默认是packed,但是具体证据没有找到,有查到信息的网页贴下地址或图片。如果要改成 planar,感觉需要设置 extra format information。

3.大端和小端

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

大端符合人阅读常识。比如 1234,其中 1是数据的高位,4是数据的低位。如果用大端存储,则存在内存中为 1234;如果用小端存储,则存在内存中为 4321。

4.实际文件分析

在这里插入图片描述
根据前面的知识知道, RIFF chunk 大小为 12 byte; Format chunk 大小为 24 byte

RIFF chunk 内容为

52 49 46 46 / f4 b1 37 00 / 57 41 56 45

ASCII 码表中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Size = 0x0037b1f4 (3,650,036)
文件大小 fileSize 为
在这里插入图片描述
两者刚好相差 8。


Format chunk

66 6d 74 20 / 10 00 00 00 / 01 00 / 02 00/ 22 56 00 00/ 88 58 01 00/ 04 00/ 10 00

ID

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

size

size = 0x10 (16)

AudioFormat

audioformat = 0x01 表示 PCM

NumChannels

numchannels = 0x02 表示双通道

SampleRate

samplerate = 0x5622 (22050)

ByteRate

byterate = 0x015888 (88200) = 22050216/8

BlockAlign

blockalign = 0x04 = 2*16/8

BitsPerSample

bitspersample = 0x10 (16bits)

Data chunk

64 61 74 61 / d0 b1 37 00

ID

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

size

size = 0x37b1d0 (3650000)
3650000 + 12 + 24 + 8 = 3650044 (文件大小)

参考文献:

https://www.jianshu.com/p/947528f3dff8

测试的音频文件

https://download.csdn.net/download/dss875914213/75111021
音频来源网络 如有侵权请联系删除。
没有积分的人,也可主动联系我。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值