(三)格式分析

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'                       |

每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节;紧跟在ID后面的是Chunk大小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。

1.RIFF WAVE Chunk

==================================

| ID    |  4 Bytes  |   'RIFF'    |

----------------------------------

| Size  |  4 Bytes  |               |

----------------------------------

| Type |  4 Bytes  |   'WAVE' |

----------------------------------

struct RIFF_HEADER

{

char szRiffID[4];        // 'R','I','F','F'

DWORD dwRiffSize;   // file size -  8(id length + size length)

char szRiffFormat[4]; // 'W','A','V','E'

}

2.Format Chunk

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

一般情况下Size为16,此时最后附加信息没有;如果为18 则最后多了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;

};

3.Fact Chunk

Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。

==================================

| ID    |  4 Bytes |   'fact'    |

----------------------------------

| Size |  4 Bytes |      4      |

----------------------------------

| Data | 4 Bytes |              |

----------------------------------

struct FACT_BLOCK

{

char       szFactID[4]; // 'f','a','c','t'

DWORD  dwFactSize;

};

4.Data Chunk

Data Chunk是真正保存wav数据的地方,

==================================

| ID    |  4 Bytes |   'data'    |
----------------------------------
| Size  |  4 Bytes |              |
----------------------------------
| data  |             |              |
----------------------------------

在多声道WAVE文件中,样本是交替出现的,如16bit的单声道WAVE文件和双声道WAVE文件的数据采样格式如下:

16位单声道:

采样一

采样二

……

低字节

高字节

低字节

高字节

……

16位双声道:

采样一

……

左声道

右声道

……

低字节

高字节

低字节

高字节

……

struct DATA_BLOCK

{

char szDataID[4]; // 'd','a','t','a'

DWORD dwDataSize;

};

版权申明:本站文章均来自网络,如有侵权,请评论 ,收到后立即删除,谢谢!

wav文件格式分析(二)的更多相关文章

  1. wav文件格式分析详解

    wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式 ...

  2. WAV文件格式分析

    一. RIFF概念 在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这样的结构称为"资源互换文件格式"(Resources lnterchange File ...

  3. wav文件格式分析与详解

    WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...

  4. 【转载】wav文件格式分析与详解

    WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...

  5. wav文件格式分析(一)

    (一)概述 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范: (二)音频知识 1.常见的声音文 ...

  6. wav文件格式分析(三)

    (四)附表 1.头格式表: 2.PCM数据的存放方式 3.PCM波形样本的数据格式 WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数. 首先存储低有效字节,表示样 ...

  7. WAV文件格式解析及处理

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...

  8. wav文件格式及ffmpeg处理命令

    wav文件头详解 符合RIFF(Resource Interchange File Format)规范的wav文件的文件头记录了音频流的编码参数等基本信息.wav文件由多个块组成,至少包含RIFF标志 ...

  9. WAV文件格式

    作者:阿宝 更新:2016-09-21 来源:彩色世界(https://blog.hz601.org/2016/09/21/waveform-audio-file-format/index.html) ...

随机推荐

  1. nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件

    目前公司Web服务端的开发是用Nodejs,所以开发功能的话首先使用Nodejs,这也是为什么不直接用python转换的原因. 由于node对文本的处理(提取所需信息)的能力不强,类似于npm上的包: ...

  2. MySQL 的 RowNum 实现

    MySQL 的 RowNum 实现 MySQL 下面没有RowNum,排序后序号却无法得到,比较麻烦! 在网上找了再三,通过比较,确认了以下的方法是可行的 : rownum, CollectSn ,b ...

  3. 百度地图API示例之设置级别setZoom与禁止拖拽disableDragging

    百度地图API示例之设置级别setZoom与禁止拖拽disableDragging 设置级别 <html> <head> <meta http-equiv="C ...

  4. Android IOS WebRTC 音视频开发总结(七三)-- 我为什么走上了创业这条不归路?

    本文主要介绍自己为什么选择创业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help 2016.06.01对公司来说是个很 ...

  5. A required class was missing while executing org.apache.maven.plugins:maven-war-plugin:2.1.1:war

    完美解决方案: http://stackoverflow.com/questions/18442753/a-required-class-was-missing-while-executing-org ...

  6. WebForm---增删改(内置对象)

    一.添加 前台代码: <body> <form id="form1" runat="server"> <h1>用户添加< ...

  7. [vivado系列]设置Xilinx Documention Navigator

    版本:2015.1 ------------------------------------------ 这是一个很便利FPGA工程师的文档整理收纳神器. 针对个人使用上的习惯,进行简单的2项设置. ...

  8. 数据库中int类型存在空数据开发过程中model和dal层处理方法

    model层 public Int32? IsFullAttendance { get; set; } dal层  if (dr["IsFullAttendance"] + &qu ...

  9. 64 位 Ubuntu 下 android adb 不可用解决方法

    解决方案: 安装ia32-libs 在终端执行 sudo apt-get install ia32-libs 其间会提示所依赖的某些包不存在,直接 sudo apt-get 安装即可.

  10. Android菜鸟成长记5-ADB和sqllite

    Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...