Wave(.wav)文件格式
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嵌套组成的。
字段 | 长度(B) | 字段描述 | ||||
chunk1 | chunkId | 4 | 第一个chunk的标识始终是"RIFF" | |||
chunkSize | 4 | 该chunk的数据大小,包括chunkType | ||||
chunkType | 4 | 对于Wave文件chunk的类型为"WAVE" | ||||
data | chunk2 | chunkId | 4 | Wave文件的第二个chunk标识为"fmt" | ||
chunkSize | 4 | 该chunk的数据大小 | ||||
data | wFormatTag | 2 | 音频数据格式,0x0001表示PCM数据 | |||
nChannels | 2 | 声道数 | ||||
nSamplesPerSec | 4 | 采样率,每秒采样次数 | ||||
nAvgBytesPerSec | 4 | 每秒的音频数据大小(B),声道数*采样率*每个采样点的比特数/8 | ||||
nBlockAlign | 2 | 每个时刻的音频数据块大小(B),声道数*每个采样点的比特数/8 | ||||
wBitsPerSample | 2 | 每个采样点(的幅值)用多少比特编码(8 or 16) | ||||
chunk3 | chunkId | 4 | Wave文件的第三个chunk的标识为"data" | |||
chunkSize | 4 | 该chunk的数据大小 | ||||
data | PCM数据 | chunkSize | PCM数据 |
从上表可以看出:
(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)
为方便描述,把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
Wave(.wav)文件格式相关推荐
- wave格式分析,wave音频文件格式分析配程序
wav文件格式分析详解 程序如上一篇博文 一.综述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的. RIFF是英文Resource Interchange Fil ...
- wav文件格式分析详解
wav文件格式分析详解 作者:曹京 日期:2006年7月17日 一.综述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的. RIFF是英文Resource Inte ...
- WAV文件格式解析及处理
RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...
- wav文件格式分析与详解
wav文件格式分析与详解 WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形 ...
- C语言解析wav文件格式
目录 C语言解析wav文件 1.wav文件的二进制格式解析 1.1 RIFF chunk(资源互换文件格式块) 1.2 第一个子块fmt(描述数据子块中声音信息的格式) 1.3 第二个子块data(附 ...
- WAV 文件格式分析
一. WAV文件简介 波形音频文件格式 (WAV / WAVE)是Microsoft开发的一种数字化声音文件格式,用于在PC上存储音频比特流,文件扩展名为"*.wav". WAV文 ...
- WAV文件格式全面分析+使用CoolEdit生成正弦波
CoolEdit 生成正弦波以及WAV文件格式解析 生成正弦波 生成正弦波为: 48K采样率,单声道,一个Sample是16bit,10秒钟时间的PCM数据 生成的正弦波 将上面生成的正弦波保存为WA ...
- 音频wav文件格式分析
一.音频文件 /usr/share/sounds/deepin/stereo/desktop-login.wav 二.文件信息 syli@syli-PC:~/work/repo/Demo/pa$ ...
- 数据压缩——WAV文件格式分析
目录 WAV文件概述 WAV文件格式 一.案例分析 二.代码分析 1.建立结构体 2.读取数据段长度 3.结果 参考 WAV文件概述 WAV文件是在PC机上常见且最经典的多媒体音频文件,文件扩展名为W ...
最新文章
- linux安装vsftp教程,CentOS7 vsftp 安装与配置(视频教程)
- 数据库开发——MySQL——多表查询
- 我们用过的linux系统
- c语言中组合函数,排列组合c怎么算 公式是什么
- isinstance_Java类class isInstance()方法及示例
- JSP--(使用请求转发的动作标识jsp:forward)
- 拉取ftp服务器上的文件_无公网IP环境下搭建外部访问FTP文件共享服务器
- WPF特效-实现3D足球效果
- 很不错标签云js插件
- 运动会管理系统java
- 接口返回数据带横杠时的正确写法
- MYSQL建表时PK,NN,UQ,BIN,UN,ZF,AI字段标识的意义
- java横向导出excel_Java中导入、导出Excel
- WIN7修改“桌面”存储位置
- JetBrains全家桶软件
- 【NCNN解读】——benchmark部分
- 亿美软通史东旭:5G消息热潮下的安全冷思考丨5GMASSAGING · 上海站预告
- 基于智能空间布局优化的系留低空应急通信系统设计及研究
- iPad 使用技巧:Apple Pencil
- 新年将至,如何用python给朋友送上新年祝福呢?