WAV文件格式分析
来源:互联网 发布:网络新媒体就业前景 编辑:程序博客网 时间:2024/06/07 03:22
一.WAV文件的定义:
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几。
WAV打开工具是WINDOWS的媒体播放器,通常使用三个参数来表示声音,量化位数,取样频率和采样点振幅,量化位数分为8位,16位,24位三种。声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz),22050Hz(22kHz)和44100Hz(44kHz)三种,不过尽管音质出色,但在压缩后的文件体积过大,其大小不随音量大小及清晰度的变化而变化。
二.WAV文件的数据结构:WAV文件的数据结构由两部分组成数据块和文件头。
(1)文件头的结构如下:
对于WAV文件来说,每个文件的头4字节为RIFF.
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVEChunk,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'|
RIFF WAVE Chunk
||所占字节数| 具体内容 |
|ID|4 Bytes|'RIFF'|
|Size|4Bytes||
|Type|4Bytes|'WAVE'|
以RIFF作为标识符,之后紧跟size字段,其表示的是整个WAV文件的大小减去ID和size所占得字节数之后的结果,最后是type表示WAV文件。
结构定义如下:
struct RIFF_HEADER
{
char szRiffID; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat; // 'W','A','V','E'
};
Format Chunk
||字节数|具体内容|
|ID|4 Bytes|'fmt'|
|Size|4Bytes|数值为16或18,18则最后又附加信息|
|FormatTag|2Bytes|编码方式,一般为0x0001|
|Channels| 2
|SamplesPerSec|4Bytes|采样频率
|AvgBytesPerSec|4Bytes|每秒所需字节数||===>WAVE_FORMAT
|BlockAlign|2Bytes|数据块对齐单位(每个采样需要的字节数)||
|BitsPerSample|2 Bytes|每个采样需要的bit数||
||2Bytes|附加信息(可选,通过Size来判断有无)||
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|4Bytes|'fact'|
|Size|4Bytes|数值为4|
|data|4Bytes||
Fact Chunk
Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
结构定义如下:
struct FACT_BLOCK
{
char szFactID; // 'f','a','c','t'
DWORD dwFactSize;
};
Data Chunk
||所占字节数|具体内容|
|ID|4Bytes|'data'|
|Size|4Bytes||
|data|||
Data Chunk
Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,wav数据的bit位置可以分成以下几种形式:
对于8位单声道,每个样本数据由8位(bit)表示;
对于8位立体声,每个声道的数据由一个8位(bit)数据表示,且第一个8位(bit)数据表示0声道(左)数据,紧随其后的8位(bit)数据表示1声道(右)数据;
对于16位单声道,每个样本数据由16位(bit)表示;其中低字节存放高位,高字节存放低位;
对于16位立体声,每个声道的数据由一个16位(bit)数据表示,且第一个16位(bit)数据表示0声道(左)数据,紧随其后的16位(bit)数据表示1声道(右)数据。
|单声道|取样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(右)|
||(低位字节)|(高位字节)|(低位字节)|(高位字节)
Data Chunk头结构定义如下:
struct DATA_BLOCK
char szDataID;// 'd','a','t','a'
DWORD dwDataSize;
};
chunk是组成RIFF文件的基本单元,它的基本结构如下:
struct chunk
{
u32 id; /* 块标志 */
u32 size; /* 块大小 */
u8 dat[size]; /* 块内容 */
};
id 由4个ASCII字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt','data','WAV','AVI'等等,由于这种文件结构最初是由Microsoft和IBM为PC机所定义,RIFF文件是按照little-endian字节顺序写入的。
size(块大小)是存储在data域中数据的长度,id与size域的大小则不包括在该值内。
dat(块内容)中所包含的数据是以字(WORD)为单位排列的,如果该数据结构长度是奇数,则在最后添加一个空(NULL)字节。
chunk块中有且仅有两种类型块:'RIFF'和'LIST'类型可以包含其他块,而其它块仅能含有数据。
'RIFF'和'LIST'类型的chunk结构如下:
structchunk
{
u32 id; /* 块标志 */
u32 size; /* 块大小 */
/*此时的dat = type + restdat */
u32 type ; /* 类型 */
u8 restdat[size] /* dat中除type4个字节后剩余的数据*/
};
可以看出,'RIFF'和'LIST'也是chunk,只是它的dat由两部分组成type和restdat。
type,由4个ASCII字符组成,代表RIFF文件的类型,如'WAV','AVI ';或者'LIST'块的类型,如avi文件中的列表'hdrl','movi'。
restdat,dat中除type的4个字节后剩余的数据,包括块内容,包含若干chunk和'LIST'。
- wav文件格式分析详解
- WAV文件格式分析
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- WAV文件格式分析
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- wav文件格式分析详解
- WAV文件格式分析
- wav文件格式分析详解
- 最长上升连续子序列
- Android开发准备——Java和Android Studio环境搭建
- JZOJ 4.15 1666——【AHOI2009】飞行棋
- JSP入门_TWO
- wsdl配置文件
- WAV文件格式分析
- 一些常见的问题错误及解决方式
- C++<set>集合
- iOS
- IDA Pro使用前先修内容
- Java中泛型的一个细节
- Html 播放MP4
- 代理模式 Proxy
- 〖参赛收获〗记录点滴成长