Wave(.wav)文件格式

article/2025/10/12 8:58:50

Wave文件格式主要是用来存储音频PCM数据的,其实也可以存储非PCM音频数据,这种情况我们就不考虑了。文件的扩展名为“.wav”,采用RIFF文件结构。

一、RIFF文件格式简介

1、RIFF文件是由一个一个的chunk组成的,并且chunk之间可以嵌套。使用小端存储。

2、chunk的基本结构如下:

struct chunk
{char   chunkId[4];       // 4个字符组成的chunk标识,少于4字符右补空格U32    chunkSize;        // 数据块的大小,字节char   data[chunkSize]
};

chunkId可以为"RIFF"、"LIST"、"fmt"、"data"...

3、当chunkId为"RIFF"或"LIST"(类型块)时,chunk的结构变形为下面这样:

struct chunk
{char    chunkId[4];    // 4字符组成的chunk标识,少于4字符右补空格U32     chunkSize;     // chunkType + data的数据大小,字节char    chunkType[4];  // chunk的类型,e.g. WAVE/AVI...char    data[chunkSize - 4]
};

二、Wave文件格式

1、Wave文件采用RIFF文件格式,当然也就遵循RIFF文件结构。总体来看Wave文件是由多个chunk嵌套组成的。

Wave文件格式
字段长度(B)字段描述
chunk1chunkId4第一个chunk的标识始终是"RIFF"
chunkSize4该chunk的数据大小,包括chunkType
chunkType4对于Wave文件chunk的类型为"WAVE"
datachunk2chunkId4Wave文件的第二个chunk标识为"fmt"
chunkSize4该chunk的数据大小
datawFormatTag2音频数据格式,0x0001表示PCM数据
nChannels2声道数
nSamplesPerSec4采样率,每秒采样次数
nAvgBytesPerSec4每秒的音频数据大小(B),声道数*采样率*每个采样点的比特数/8
nBlockAlign2每个时刻的音频数据块大小(B),声道数*每个采样点的比特数/8
wBitsPerSample2每个采样点(的幅值)用多少比特编码(8 or 16)
chunk3chunkId4Wave文件的第三个chunk的标识为"data"
chunkSize4该chunk的数据大小
dataPCM数据chunkSizePCM数据

从上表可以看出:

(1) Wave文件最外层是一个标识为"RIFF"的类型块chunk1

(2) 在chunk1的data部分嵌套了2个chunk,即chunk2和chunk3

(3) chunk2的标识为"fmt",在它的data部分存储音频的一些相关属性

(4) chunk3的标识为"data",在它的data部分存储具体的音频PCM数据

2、PCM数据存储格式

三、实例分析

文件:C:\Windows\Media\Windows 关机.wav

工具:notepad++ Hex Editor插件(或者UltraEdit)

Windows 关机.wav

为方便描述,把Wave文件的各个字段进行了1-14编号 


1: 0x 52 49 46 46,4字节,"RIFF"的ASCII码,对应chunk1的chunkId字段


2: 0x dc 95 02 00,4字节,小端存储,转为大端字节序0x 00 02 95 dc,即十进制的169436

表示chunk1的数据大小为169436字节,对应chunk1的chunkSize字段

查看Windows 关机.wav文件的大小为169444字节,chunkId和chunkSize占用8字节,所以还有169436字节


3: 0x 57 41 56 45,4字节,"WAVE"的ASCII码,对应chunk1的chunkType字段


4: 0x 66 6d 74 20,4字节,"fmt "的ASCII码,"fmt"不够4个字符,所以右边补空格

对应chunk2的chunkId字段


5: 0x 10 00 00 00,4字节,小端存储,转为大端字节序0x 00 00 00 10,即十进制的16

表示chunk2的数据大小为16字节,由上面表格可知,wFormatTag、nChannels、nSamplesPerSec、nAvgBytesPerSec、nBlockAlign、wBitsPerSample总共16字节

对应chunk2的chunkSize字段


6: 0x 01 00,2字节,转为大端字节序0x 00 01,表示Wave文件存储的是音频PCM数据

 对应chunk2的data部分的wFormatTag字段


7: 0x 02 00,2字节,转为大端字节序0x 00 02,即十进制的2,表示声道数为2即双声道

对应chunk2的data部分的nChannels字段


8: 0x 44 ac 00 00,4字节,转为大端字节序0x 00 00 ac 44,即十进制的44100,表示音频采样率为44100Hz

 对应chunk2的data部分的nSamplesPerSec字段


9: 0x 10 b1 02 00,4字节,转为大端字节序0x 00 02 b1 10,即十进制的176400

表示每秒的音频数据大小为176400B,该值等于”声道数*采样率*每个采样点的比特数/8”

即2 * 44100 * 16 / 8 = 176400,对应chunk2的data部分的nAvgBytesPerSec


10: 0x 04 00,2字节,转为大端0x 00 04,即十进制的4

表示每个时钟(有2个采样点)的音频数据有4B大小,该值等于”声道数*每个采样点的比特数/8”

即2 * 16 / 8 = 4,对应chunk2的data部分的nBlockAlign字段


11: 0x 10 00,2字节,转为大端0x 00 10,即十进制的16,表示每个采样值用16比特编码

对应chunk2的data部分的wBitsPerSample字段


12: 0x 64 61 74 64,4字节,"data"的ASCII码,对应chunk3的chunkId字段


13: 0x b8 95 02 00,4字节,转为大端0x 00 02 95 b8,即十进制的169400

表示chunk3的data部分的数据大小即PCM音频数据的大小,对应chunk3的chunkSize字段


14: 音频PCM数据,chunk3的data


http://chatgpt.dhexx.cn/article/hfdeDtNB.shtml

相关文章

wave文件格式

Wave文件采用RIFF文件格式,总体来看Wave文件是由多个chunk嵌套组成的;Wave文件最外层是一个标识为"RIFF"的类型块chunk1;在chunk1的data部分嵌套了2个chunk,即chunk2和chunk3;chunk2的标识为"fmt"…

WAVE 文件格式分析

WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件…

html wave标签,html wave的实现

如何实现wave动画?求demo 我理解的关键点: 1、色彩的均匀渐变,比较柔和,没有明显的过渡层 2、不同频率的正弦波 我的实现: 效果相差很大! let canvas1 = document.querySelector(#canvas1); let ctx = canvas1.getContext(2d); canvas1.width = canvas1.parentNode.offset…

802.11ac Wave2 将为WIFI性能和效果带来提升

Wi-Fi联盟推出的第二代802.11ac认证项目,使Wi-Fi网络的速度和效率又向前迈了一大步。 802.11ac正式颁布于2014年,标准包含了很多新特性,这些特性受到了Wi-Fi供应商和消费者的欢迎,特性包括: 采用5GHz频段 更宽的通道 更…

802.11ac wave2的前世今生

2015年下半年,高通、博通、RTL等芯片厂商相继发布了满足802.11ac wave2要求的芯片,WLAN及终端厂商也迅速跟进推出相应的产品和终端。802.11ac wave2在多方推动下于2015年底实现了商用,标志着802.11ac进入了新的发展阶段。 突破多用户并发能力…

什么是Wi-Fi Wave 2?

802.11ac的第二波浪潮(即Wave 2)已经拍到了岸边,而新的MU-MIMO(多用户、多路输入多路输出)技术也正在引起业界的骚动。它正是我们已经看到的Wi-Fi的巨大潜力之一,可大大提升无线网络的吞吐量,并将在密度和容量上与之前的无线网络产生巨大差异…

什么是802.11ac和802.11ac Wave2

什么是802.11ac和802.11ac Wave2 简介什么是802.11ac802.11ac VS 802.11n802.11ac Wave1的关键技术802.11ac Wave2 VS 802.11ac Wave1802.11ac Wave2的关键特性 简介 从1997年第一代802.11标准802.11发布至今,Wi-Fi经历了巨大的发展和普及,802.11ac的推…

wave2lip训练

论文:https://arxiv.org/pdf/2008.10010.pdf 训练源码:https://github.com/Rudrabha/Wav2Lip 经过调整过的代码:https://gitee.com/sparkle__code__guy/wave2lip ffmpeg的安装:https://blog.csdn.net/sslfk/article/details/1…

802.11ac wave 2:你需要知道的6件事

Wi-Fi联盟是全球非盈利性组织,旨在改善Wi-Fi技术的互操作性。近日,Wi-Fi联盟认证了802.11ac wave 2标准,新标准带来了一系列的更新,最终可能会影响消费者及企业的日常连接。 下面让我们看看这六个性能变化: 1.可能实现…

被吹上天的802.11ac Wave2到底好在哪?还有,Wave1哪去了?

802.11ac Wave2到底好在哪? 在说Wave2之前,我们先要了解802.11ac是什么,它的特点是什么。IEEE 802.11ac是802.11的一个通信标准,802.11n的升级版。再具体的渊源这里就不讲了,感兴趣的可自行查阅资料。重点来了&#x…

Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题

问题描述 在前端vue中设置的自定义请求头参数:token 控制层可以正常获取到自定义请求头参数 拦截器中无法获取 下方是拦截器代码 Component public class JWTInterceptor implements HandlerInterceptor {private final Logger logger LoggerFactory.getLogge…

为什么prehandle被调用两次

为什么prehandle被调用两次 今天我自己尝试写了个拦截器,意外发现这个拦截器执行了两次,查阅很多文章过后却还是没能解决问题。 网上提供的解决方法有:1、排除重复扫描原因,导致拦截器执行多次,2、排除xml重复导入&a…

spring过滤器中 preHandle方法获取方法中的requestParam参数

不想写了 直接截图 postman请求 接口 过滤器中 下面方法即可 request.getParameter(“token”);

SpringMVC拦截器仅调用preHandle()方法的解决办法

在学习SpringMVC拦截器时,想调用拦截器,但是只运行了preHandle()这个方法, 可见postHandle(),afterCompletion()以及发出请求的方法都没有被执行,原来是preHandle()的返回值忘记更改了。应该设置为true。preHandle()方…

Java框架(八)--SpringMVC拦截器(1)--拦截器开发流程、多Interceptor执行顺序及preHandle返回值

拦截器-Interceptor 拦截器(Interceptor)用于对URL请求进行前置/后置过滤。 Interceptor与Filter用途相似,但实现方式不同。 Interceptor为SpringMVC的标准组件。 Filter为J2EE的标准组件。 Interceptor底层就是基于Spring AOP面向切面编程实…

SpringMvc拦截器preHandle,postHandle,afterCompletion

目录 1.拦截器介绍 2.SpringMVC执行流程( 内含拦截器执行流程 ) 3.拦截器类 4.拦截器preHandle,postHandle,afterCompletion preHandle postHnadle afterCompletion 1.拦截器介绍 SpringMVC中的Interceptor拦截器是非常重要的,他的作…

Interceptor的基本介绍和使用preHandle、postHandle与afterCompletion

目录 preHandlepostHandleafterCompletion项目测试代码项目测试 preHandle 调用时间:Controller方法处理之前 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行 若返回false,则中断执行,注…

preHandle执行多次问题

首先说下我的问题吧,我是swagger测试多个接口,其他接口没有啥问题,但是就是查询第三方系统的接口一直请求多次,最后debug看了下第二次的请求路径,卧槽,这个不是别的系统的路径吗,瞬间明白了。 …

java 中prehandle,Spring MVC中拦截器HandlerInterceptorAdapter中的preHandle方法

拦截器:顾名思义,就是对请求进行拦截,做一些预处理、后处理或返回处理的操作 Spring MVC中使用拦截器的方法,继承HandlerInterceptorAdapter类,并根据需求实现其中的preHandle方法(预处理)、postHandle方法(返回处理)&…