WAVE文件格式解析

WAVE 文件作为Windows多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。这里不针对RIFF文件格式做介绍,不太了解的可以参考“RIFF格式简介”一文。

WAVE文件构成

每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分。相对于RIFF文件,只是将“RIFF”chunk的form id替换为“WAVE”。下表是一个典型的WAVE文件各部分构成及其长度字段。注意所有数据采用windows默认的小端存储。(FOURCC是一个特殊的四字节码,判断时按照字符顺序判断即可。)

长度 内容说明
chunkID 4 Chunk ID: "RIFF",FOURCC四字节码
chunksize 4 Chunk size: 4+n
  WAVEID 4 WAVE ID: "WAVE",FOURCC四字节码
WAVE chunks n Wave chunks包含格式信息和音频采样数据,分为“format” chunk和“data”chunk两部分。

Format chunk

Format chunk用于说明data chunk中PCM数据的格式。主要三种不同的format chunk格式(不同的格式码)。如下表:

长度 内容说明
ckID 4 Chunk ID: "fmt ",FOURCC四字节码,注意最后一个填充是空格。
cksize 4 Chunk size: 16 or 18 or 40
  wFormatTag 2 Format code,格式码
nChannels 2 Number of interleaved channels,采样声道数(交织存储)
nSamplesPerSec 4 Sampling rate (blocks per second),音频采样率
nAvgBytesPerSec 4 Data rate,音频码率
nBlockAlign 2 Data block size (bytes),音频数据块大小(单位字节)
wBitsPerSample 2 Bits per sample,量化位数(比如8bits、16bits、32bits)

cbSize 2 Size of the extension (0 or 22),扩展字段长度

wValidBitsPerSample 2 Number of valid bits,有效的位长度
dwChannelMask 4 Speaker position mask,声道描述掩码,比如左声道、右声道等
SubFormat 16 GUID, including the data format code,数据格式码

标准中定义的wFormatTag(Format code)可取值范围如下表:

Format Code PreProcessor Symbol Data
0x0001 WAVE_FORMAT_PCM PCM
0x0003 WAVE_FORMAT_IEEE_FLOAT IEEE float,[-1.0f,1.0f]
0x0006 WAVE_FORMAT_ALAW 8-bit ITU-T G.711 A-law
0x0007 WAVE_FORMAT_MULAW 8-bit ITU-T G.711 µ-law
0xFFFE WAVE_FORMAT_EXTENSIBLE Determined by SubFormat

PCM格式

当wFormatTag为0x0001时,表示WAVE文件中存储的是PCM格式的音频数据。

在数据域中除了单声道-量化位数为8音频数据之外PCM存储格式按照补码的形式存放。对于单声道、量化位数为8的情况,使用offset binary(偏移二进制码),有兴趣的可以查看下对应的标准。

非PCM格式

对于非PCM格式的数据,使用扩展字段,扩展字段长度由cbSize指定。需要说明以下几点:

  • 对于非PCM格式,必须有扩展字段,字段长度cbSize可以为0,但是扩展字段不可省略。
  • 对于浮点数据,最大峰值为1,量化位数(bits/sample)取值可以是32或64。
  • 对于 log-PCM formats (µ-law and A-law)的格式,量化位数(bits/sample)取值为8。
  • 对于非PCM格式,必须包含“FACT”chunk。

扩展格式

当FormatTag为WAVE_FORMAT_EXTENSIBLE(0xFFFE)时,表示format chunk有扩展字段,其中包括有效量化位数(wValidBitsPerSample)、声道位置掩码、以及额外的GUID(SubFormat)。

  • 在正常PCM数据中量化位数(wBitsPerSample)必须是8的倍数,在WAVE_FORMAT_EXTENSIBLE下量化位数可以使用wValidBitsPerSample来描述,也就是会所wValidBitsPerSample有可能小于wBitsPerSample。
  • 对于声道位置掩码的信息,可参考如下文章:Multi-channel / high bit resolution formats, 2001-12-04: Multiple Channel Audio Data and WAVE Files
  • SubFormat代表的GUID前两个字节是由PCM数据格式填充的,例如WAVE_FORMAT_EXTENSIBLE。后续的14个字节是固定的,"\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71"。

在以下几种情况下必须使用WAVE_FORMAT_EXTENSIBLE格式:

  1. PCM数据的量化位数(wBitsPerSample)大于16。
  2. 音频采样声道数大于2。
  3. 实际量化位数不是8的倍数。
  4. 存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序映射的情况。

FACT chunk

通常PCM数据是不压缩的,对于所有压缩的非PCM格式都需要有FACT chunk。具体可参考:WAVE update (Revision: 3.0), 1994-04-15: Multimedia Registration Kit Revision 3.0 (Q120253))。FACT chunk至少定义一个字段,实际采样数dwSampleLength。

关于FACT chunk可以了解,但是很少用到,如果有这种格式的wav文件,建议参考上述标准解析。

DATA chunk

data chunk中包含采样数据。格式如下:

长度 内容说明
ckID 4 Chunk ID: "data"
cksize 4 Chunk size: n
  sampled data n Samples,音频采样数据,交织存储
pad byte 0 or 1 Padding byte if n is odd,填充字节

实例

由于微软将多媒体输入输出函数废弃了(Using Multimedia File I/O),这里不给出专门读写的代码,而是直接使用二进制形式分析。

先做如下假定:

  • Nc 表示channels,声道数
  • Ns表示文件中包含的实际采样块数目,每个采样块包括Nc 个独立采样
  • 采样率为 F (blocks per second,单位Hz)
  • 每个采样的长度为M字节。

PCM文件格式如下表:

Field Length Contents
ckID 4 Chunk ID: "RIFF"
cksize 4 Chunk size: 4 + 24 +
(8 + Nc * Ns + (0 or 1))
  WAVEID 4 WAVE ID: "WAVE"

ckID 4 Chunk ID: "fmt "
cksize 4 Chunk size: 16
  wFormatTag 2 WAVE_FORMAT_PCM
nChannels 2 Nc
nSamplesPerSec 4 F
nAvgBytesPerSec 4 F * M * Nc
nBlockAlign 2 Nc
wBitsPerSample 2 rounds up to 8 * M

ckID 4 Chunk ID: "data"
cksize 4 Chunk size: M * Nc* Ns
  sampled data M * Nc * Ns Nc * Ns channel-interleaved M-byte samples
pad 0 or 1 Padding byte if M * Nc * Nis odd

注意WAVE文件可能附加information chunk。所以程序解析是最好按照上述标准定义,不要认为去掉wav fmt chunk之后全是data chunk。

Extensible Format如下表:

Field Length Contents
ckID 4 Chunk ID: "RIFF"
cksize 4 Chunk size: 4 + 48 + 12 +
(8 + M * Nc * Ns + (0 or 1))
  WAVEID 4 WAVE ID, "WAVE"

ckID 4 Chunk ID: "fmt "
cksize 4 Chunk size: 40
  wFormatTag 2 WAVE_FORMAT_EXTENSIBLE
nChannels 2 Nc
nSamplesPerSec 4 F
nAvgBytesPerSec 4 F * M * Nc
nBlockAlign 2 M * Nc
wBitsPerSample 2 8 * M
cbSize 2 Size of the extension: 22
wValidBitsPerSample 2 at most 8 * M
dwChannelMask 4 Speaker position mask: 0
SubFormat 16 GUID (first two bytes are the data format code)

ckID 4 Chunk ID: "fact"
cksize 4 Chunk size: 4
  dwSampleLength 4 Nc * Ns

ckID 4 Chunk ID: "data"
cksize 4 Chunk size: M * Nc * Ns
  sampled data M * Nc *Ns Nc * Ns channel-interleaved M-byte samples
pad 0 or 1 Padding byte if M * Nc * Ns is odd

本文主要参考:Audio File Format Specifications,相关测试wav文件及标准也从其链接下载。

写作本文的目的主要是学习下wave文件格式,并能够将音频数据解析出来。

以上介绍的内容中针对WAVE文件我们可以只关心,fmt chunk、data chunk数据,其他数据chunk可以忽略,如果你对其他chunk感兴趣,建议查看rfc2361及Microsoft提供的标准文档。

时间: 2024-10-09 20:56:32

WAVE文件格式解析的相关文章

(转)AVI文件格式解析+AVI文件解析工具

AVI文件解析工具下载地址:http://download.csdn.net/detail/zjq634359531/7556659 AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉.编辑.回放等应用程序中.通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的.AVI可以算是

转wave 文件解析

转 1 WAVE 文件格式分析 WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.每个WAVE文件的头四个字节便是"RIFF".WAVE 文件由文件头和数据体两大部分组成.其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分.WAVE文件各部分内容及格式见后文. 常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率.8Bit 的采样值)和双声道(44

CSV文件格式解析器的实现:从字符串Split到FSM

本文分为5小节,基本上就是我刚接触CSV文件到思考.实践做一个CSV解析器的过程的还原.希望我的思路也能带领你一步步从浅到深认识CSV文件格式. 1.简单的CSV解析器实现. 2.简单实现的CSV解析器的问题 3. CSV格式的定义 4.用FSM(有限状态机)来做CSV格式解析. 5.为什么使用CSV格式 1.简单的CSV解析器实现. 最近有一个需求,读取CSV格式的配置.CSV是CommaSeparated Value(逗号分隔值)的缩写,通常用文本表示数据.CSV格式数据的结构类似表格,不同

多媒体(2):WAVE文件格式分析

目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(2):WAVE文件格式分析

ArcGIS三大文件格式解析

原文 ArcGIS三大文件格式解析 Shape数据 Shapefile是ArcView GIS 3.x的原生数据格式,属于简单要素类,用点.线.多边形存储要素的形状,却不能存储拓扑关系,具有简单.快速显示的优点.一个shapefile是由若干个文件组成的,空间信息和属性信息分离存储,所以称之为“基于文件”. 每个shapefile,都至少有这三个文件组成,其中: *.shp 存储的是几何要素的的空间信息,也就是XY坐标 *.shx 存储的是有关*.shp存储的索引信息.它记录了在*.shp中,空

FLV文件格式解析

FLV文件格式解析 媒体格式分析之flv -- 基于FFMPEG

C++PE文件格式解析类(轻松制作自己的PE文件解析器)

PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣的能够參看之后列出的參考资料及其它相关内容. 近期我也在学习PE文件格式,參考了很多资料.用C++封装了一个高效方便的PE文件格式解析的类. 该类对想学PE文件结构的朋友可算一份可贵的资料.代码均非常易懂,考虑较全面,具有一定的通用性. 同一时候该类也能够让想创建自己的PE文件解析软件的朋能够轻松在

解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)

解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.org/project/prototxt-parser1.yield让函数执行支持分段,让函数支持了记忆和状态,能够让一个函数变成状态机,这样一个状态机的执行流程可能直接表达在一个函数中,让整个处理流程更加顺畅.2.parsy的optional,Returns a parser that expects

PDF文件格式解析(1)- 了解PDF的语法格式

PDF文件格式解析(1)- 了解PDF的语法格式 PDF格式 由Adobe Systems Incorporated开发的PDF(便携式文档格式)被Adobe描述为一种通用的文档表示语言.PDF代表格式化的,面向页面的文档.这些文档可以是结构化的或简单的.它们可能包含文本,图像,图形和其他多媒体内容,例如视频和音频.支持注释,元数据,超文本链接和书签.更高版本提供了其他功能,例如,将地理空间信息嵌入到代表地图或其他地理空间图像(例如卫星照片)的文档中. PDF的核心是源自PostScript页面