WAV 文件解析 本文共有3042个字,关键词: ### 1.概述 wav 文件,原来存放音频的原始数据,即对 PCM 文件进行简单封装,在文件开头加上标识,并提供音频的声道数、采样频率和采样位数等信息,这样播放器解析这些数据就可以正常播放这段音频了。 ### 2.格式解析 wav 文件一般由3个区块组成:RIFF chunk、Format chunk 和 Data chunk。 RIFF chunk:主要说明本文件保存的是什么内容。 Formt chunk:主要说明音频文件的格式 Data chunk:主要记录音频的数据 ### 2.1 RIFF chunk ![](https://ww4k.com/usr/uploads/2024/08/2166628670.png) ID 固定死,填入 RIFF ,作为标识。 Size 为文件长度减去 ID 和 Size 的长度,即 fileSize - 8 Type 如果是 WAVE,表示后面有 Format chunk 和 Data chunk。 ### 2.2 Format chunk ![](https://ww4k.com/usr/uploads/2024/08/272012894.png) ID 固定死为 "fmt "(最后有个空格) Size 表示该区块,后面内容的长度 2+2+4+4+2+2 = 16 AudioFormat 表示音频格式,如果是 PCM,则填入 1。(也可能是 -2,[表示拓展格式](http://bass.radio42.com/help/html/56c44e65-9b99-fa0d-d74a-3d9de3b01e89.htm "表示拓展格式"),通过[WAVEFORMATEXTENSIBLE 结构体](https://learn.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-waveformatextensible "WAVEFORMATEXTENSIBLE 结构体") 获取额外信息) NumChannels 表示声道数 SampleRate 表示采样率 ByteRate 每秒数据字节数 SampleRateNumChannelsBitsPerSample/8 BlockAlign 每次采样产生的字节数 NumChannels*BitPerSample/8 BitsPerSample 一个声道一次采样的位数 ### 2.3 Data chunk ![](https://ww4k.com/usr/uploads/2024/08/689525085.png) ID 固定死为 data Size 表示数据的长度(字节),N = ByteRate*seconds Data 音频数据。 音频数据解析拓展 本处介绍的 wav 数据,默认内部存储的是 pcm数据,但是如何解析这个 pcm 数据呢?虽然前面格式里面保存了,每个采样的字节数,但是没有写是大端还是小端;数据是整数还是浮点;planar和packed? 大端还是小端:wav 默认规定了使用的是小端,所以这个没有歧义点。 数据是整数还是浮点: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. ``` [参考文献](https://learn.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-waveformatex "参考文献") planar和packed:目前只查到wav默认是packed,但是具体证据没有找到,有查到信息的网页贴下地址或图片。如果要改成 planar,感觉需要设置 extra format information。 ### 3.大端和小端 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。 大端符合人阅读常识。比如 1234,其中 1是数据的高位,4是数据的低位。如果用大端存储,则存在内存中为 1234;如果用小端存储,则存在内存中为 4321。 ### 4.实际文件分析 ![](https://ww4k.com/usr/uploads/2024/08/1626451027.png) 根据前面的知识知道, RIFF chunk 大小为 12 byte; Format chunk 大小为 24 byte RIFF chunk 内容为 ``` 52 49 46 46 / f4 b1 37 00 / 57 41 56 45 ``` 对应 ASCII 码表 52=R 49=I 46=F 57=W 41=A 56=V 45=E 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 **对应 ASCII 码表** 66=f 6d=m 74=t 20=空格 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 对应 ASCII 码表 64=d 61=a 74=t 即:data size size = 0x37b1d0 (3650000) 3650000 + 12 + 24 + 8 = 3650044 (文件大小) 参考文献: https://www.jianshu.com/p/947528f3dff8 转载: https://blog.csdn.net/dss875914213/article/details/122396171 × yihong (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 码农心得 2024-08-22 评论 345 次浏览