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格式:
- PCM数据的量化位数(wBitsPerSample)大于16。
- 音频采样声道数大于2。
- 实际量化位数不是8的倍数。
- 存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序映射的情况。
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 + M * 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 | M * 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 * Ns is 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提供的标准文档。
WAVE文件格式解析的更多相关文章
- 转wave 文件解析
转 1 WAVE 文件格式分析 WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.每个WAVE文件的 ...
- 多媒体(2):WAVE文件格式分析
目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(2):WAVE文件格式分析
- ArcGIS三大文件格式解析
原文:ArcGIS三大文件格式解析 Shape数据 Shapefile是ArcView GIS 3.x的原生数据格式,属于简单要素类,用点.线.多边形存储要素的形状,却不能存储拓扑关系,具有简单.快速 ...
- Android init.rc文件格式解析
/***************************************************************************** * Android init.rc文件格式 ...
- mp4文件格式解析(转载)
mp4文件格式解析 原作:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的 ...
- C++PE文件格式解析类(轻松制作自己的PE文件解析器)
PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...
- 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)
解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...
- mp4文件格式解析(转)
mp4文件格式解析 MP4文件格式带数据详解 MP4文件格式的解析,以及MP4文件的分割算法
- Qt的.pro文件格式解析
Qt的.pro文件格式解析 在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下: 1.注释 .pro文件中注释采用#号,从"#&quo ...
随机推荐
- Windows 7系统如何设置计划任务?
Windows 7系统如何设置计划任务? 问题描述:Windows 7系统如何设置计划任务? 任务计划概述:任务计划,可以将任何脚本.程序或文档安排在某个时间运行.“任务计划”在每次启动windows ...
- unknown log format "main" in /nginx/conf/nginx.conf
vi /nginx/conf/nginx.conf找到http{ }模块中的 log_format去掉注释,或是log_format写到了别处. 解决方法: 将log_format 写到http开头 ...
- 【Android】详解Android的menu菜单
在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...
- 使用Cordova搭建Andoid和iOS开发环境
最近在了解cordova ,下面的分享出来 大家可以看看, 我 有空也按照这个写写demo 1.下载node.js,进行安装 https://nodejs.org/en/ 2.安装cordova ...
- aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【基本地图的操作】
为了更简单的演示,我们创建个.NET的ASP.NET MVC4项目 好了,上面都是后话,POI说白了,就是你的用户的数据,很多数据,不过没关系,因为你的数据如果存在百度的LBS云上,那么大数据你就不用 ...
- C/C++语言中闭包的探究及比较
这里主要讨论的是C语言的扩展特性block.该特性是Apple为C.C++.Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法来创建闭包.前段时间,在对CoreData存取进 ...
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...
- PHP中的$_SERVER超全局变量
详细参数 PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document ...
- [转]用GSON 五招之内搞定任何JSON数组
关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 <Google Gson的使用方法,实现Json结构的相互转换> ,写的很好,通俗易懂. 我为什么写这篇文章呢?因为前几晚跟 ...
- Python 爬虫 大量数据清洗 ---- sql语句优化
. 问题描述 在做爬虫的时候,数据量很大,大约有五百百万条数据,假设有个字段是conmany_name(拍卖公司名称),我们现在需要从五百万条数据里面查找出来五十家拍卖公司, 并且要求字段 time( ...