wav文件格式分析详解

wav文件格式分析详解

文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395

一、综述
   
WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File
Format的缩写,每个WAVE文件的头四个
字节便是“RIFF”。
   
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE
Chunk, Format Chunk, Fact
Chunk(可选), Data Chunk。具体见下图:

------------------------------------------------
|            
RIFF WAVE
Chunk                 
|
|            
ID  =
‘RIFF‘                    
|
|            
RiffType =
‘WAVE‘               
|
------------------------------------------------
|            
Format
Chunk                    
|
|            
ID = ‘fmt
‘                     
|
------------------------------------------------
|            
Fact
Chunk(optional)            
|
|            
ID =
‘fact‘                     
|
------------------------------------------------
|            
Data
Chunk                      
|
|            
ID =
‘data‘                     
|
------------------------------------------------
           
图1   Wav格式包含Chunk示例

其中除了Fact
Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位
于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节
表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。
PS:
   
所有数值表示均为低字节表示低位,高字节表示高位。

二、具体介绍
RIFF WAVE Chunk
   
==================================
   
|       |所占字节数|  具体内容  
|
    ==================================
   
| ID    |  4 Bytes |   ‘RIFF‘   
|
    ----------------------------------
   
| Size  |  4 Bytes
|            
|
    ----------------------------------
   
| Type  |  4 Bytes |   ‘WAVE‘   
|
   
----------------------------------
           
图2  RIFF WAVE Chunk

以‘FIFF‘作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID
和Size所占用的字节数,即FileLen - 8 =
Size。然后是Type字段,为‘WAVE‘,表
示是wav文件。
   
结构定义如下:
 struct
RIFF_HEADER
 {
  char szRiffID[4];  //
‘R‘,‘I‘,‘F‘,‘F‘
  DWORD dwRiffSize;
  char szRiffFormat[4]; //
‘W‘,‘A‘,‘V‘,‘E‘
 };

Format Chunk
   
====================================================================
   
|              
|   字节数 
|             
具体内容               
|
   
====================================================================
   
| ID            |  4
Bytes  |   ‘fmt
‘                            
|
   
--------------------------------------------------------------------
   
| Size          |  4
Bytes  | 数值为16或18,18则最后又附加信息    
|
   
-------------------------------------------------------------------- 
----
    | FormatTag     |  2
Bytes  |
编码方式,一般为0x0001              
|     |
   
--------------------------------------------------------------------    
|
    | Channels      |  2
Bytes  | 声道数目,1--单声道;2--双声道      
|     |
   
--------------------------------------------------------------------    
|
    | SamplesPerSec |  4 Bytes  |
采样频率                            
|     |
   
--------------------------------------------------------------------    
|
    | AvgBytesPerSec|  4 Bytes  |
每秒所需字节数                      
|     |===> WAVE_FORMAT
   
--------------------------------------------------------------------    
|
    | BlockAlign    |  2 Bytes  |
数据块对齐单位(每个采样需要的字节数) |     |
   
--------------------------------------------------------------------    
|
    | BitsPerSample |  2 Bytes  |
每个采样需要的bit数                 
|     |
   
--------------------------------------------------------------------    
|
   
|              
|  2 Bytes  | 附加信息(可选,通过Size来判断有无) |    
|
   
-------------------------------------------------------------------- 
----
                           
图3  Format Chunk

以‘fmt
‘作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
   
结构定义如下:
 struct
WAVE_FORMAT
 {
  WORD wFormatTag;
  WORD wChannels;
  DWORD dwSamplesPerSec;
  DWORD dwAvgBytesPerSec;
  WORD wBlockAlign;
  WORD wBitsPerSample;
 };
 struct
FMT_BLOCK
 {
  char  szFmtID[4]; //
‘f‘,‘m‘,‘t‘,‘

  DWORD  dwFmtSize;
  WAVE_FORMAT wavFormat;
 };

Fact Chunk
   
==================================
   
|       |所占字节数|  具体内容  
|
    ==================================
   
| ID    |  4 Bytes |   ‘fact‘   
|
    ----------------------------------
   
| Size  |  4 Bytes |   数值为4  
|
    ----------------------------------
   
| data  |  4 Bytes
|            
|
   
----------------------------------
           
图4  Fact Chunk

Fact
Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
   
结构定义如下:
 struct
FACT_BLOCK
 {
  char  szFactID[4]; //
‘f‘,‘a‘,‘c‘,‘t‘
  DWORD  dwFactSize;
 };

Data Chunk
   
==================================
   
|       |所占字节数|  具体内容  
|
    ==================================
   
| ID    |  4 Bytes |   ‘data‘   
|
    ----------------------------------
   
| Size  |  4 Bytes
|            
|
    ----------------------------------
   
| data  |         
|            
|
   
----------------------------------
            
图5 Data Chunk

Data
Chunk是真正保存wav数据的地方,以‘data‘作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format
Chunk中的声道数以及采样bit数,
wav数据的bit位置可以分成以下几种形式:
   
---------------------------------------------------------------------
   
|   单声道  |    取样1   
|    取样2    |   
取样3    |    取样4   
|
   
|          
|--------------------------------------------------------
   
|  8bit量化 |    声道0    |   
声道0    |    声道0   
|    声道0    |
   
---------------------------------------------------------------------
   
|   双声道  |         
取样1           
|          
取样2          
|
   
|          
|--------------------------------------------------------
   
|  8bit量化 |  声道0(左)  |  声道1(右)  |  声道0(左) 
|  声道1(右)  |
   
---------------------------------------------------------------------
   
|          
|         
取样1           
|          
取样2          
|
    |   单声道 
|--------------------------------------------------------
   
| 16bit量化 |    声道0    | 
声道0      |    声道0   
|  声道0      |
   
|           | (低位字节)  |
(高位字节)  | (低位字节)  | (高位字节)  |
   
---------------------------------------------------------------------
   
|          
|                        
取样1                        
|
    |   双声道 
|--------------------------------------------------------
   
| 16bit量化 |  声道0(左)  |  声道0(左)  |  声道1(右)  | 
声道1(右)  |
   
|           | (低位字节)  |
(高位字节)  | (低位字节)  | (高位字节)  |
   
---------------------------------------------------------------------
                        
图6 wav数据bit位置安排方式

Data Chunk头结构定义如下:
    struct
DATA_BLOCK
 {
  char szDataID[4]; //
‘d‘,‘a‘,‘t‘,‘a‘
  DWORD dwDataSize;
 };

三、小结
   
因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

四、参考资料
    1、李敏, 声频文件格式WAVE的转换, 电脑知识与技术(学术交流),
2005.
    2、http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c8935__1/
   
3、http://www.smth.org/pc/pcshowcom.php?cid=129276

wav文件格式分析详解,码迷,mamicode.com

时间: 2024-10-29 10:46:46

wav文件格式分析详解的相关文章

Django之HttpServer服务器分析详解

大家知道,软件的正向工程,是从软件的需求获取开始,大概经历需求分析,概要分析,领域分析,设计分析,详细设计,代码实现,部署,实施这几个步骤,最终交付给用户使用.而在某些时候,比如某个软件产品是用PHP开发的,因为某些原因,我们想移植到JAVA平台去.或者某公司看到某个软件的市场前景很好,想COPY它的主要功能,然后经过加工润色后推出一个具有相同功能,更好用户体验或更多功能的软件.或者单纯的以研究软件的结构.设计思想为目的.基于这些需求,我们需要逆向工程.正向工程是一个从过程导出结果的步骤,而逆向

Mysql Join语法解析与性能分析详解

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

[转]Linux操作系统tcpdump抓包分析详解

PS:tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具.tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息.因此系统中存在网络分析工具主要不是对本

Baby_Step,Gaint_Step(分析详解+模板)

以下是总结自他人博客资料,以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程.   BL == N (mod P) 求解最小的L.由于数据范围很大,暴力不行 这里用到baby_step,giant_step算法.意为先小步,后大步. 令L=i*m+j  (m=ceil(sqrt(p-1))), 那么原式化为 B^(i*m)*B^j==N(MOD P)---->B^j===N*B^(-i*m)(MOD P) 我们先预处理B^0,B^1,B^2--B^(m-1)

Google Chrome抓包分析详解

Google Chrome抓包分析详解 一:什么是抓包 即抓取我们本地电脑与远端服务器通信时候所传递的数据包 二:Chrome浏览器讲解 Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代.调试和分析 三:打开Chrome开发者工具 在Chrome界面按F12 or在页面元素上右键点击,选择“检查” 四:开发者工具的结构 Elements(元素面板):使用“元素”面板可以通过自由操纵DOM和CSS来重演您网站的布局和设计. Console

MongoDB执行计划分析详解(1)

正文 queryPlanner queryPlanner是现版本explain的默认模式,queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan. { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "game_db.game_user", "indexFilterSet&qu

WAV文件格式分析

一. RIFF概念 在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这样的结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF.比如声音的WAV文件.视频的AV1文件等等均是由此结构衍生出来的.RIFF能够看做是一种树状结构,其基本构成单位为chunk,宛如树状结构中的节点,每一个chunk由"辨别码"."数据大小"及"数据"所组成. 块的标志符

WAV文件格式分析解析,附带吗

WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的.RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”.    WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVEChunk, Format Chunk, Fact Chunk(可选), Data Chunk.具体见下图: --------------------------------------------

Memcached原理深度分析详解

Memcached是 danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东 西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一 步的优化.末了将通过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解. 本文的部分内容可能需要比较好的数学基础作为辅助. ◎Memcached是什么 在阐述这