wav文件格式分析详解_第1页
wav文件格式分析详解_第2页
wav文件格式分析详解_第3页
wav文件格式分析详解_第4页
wav文件格式分析详解_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wav文件格式分析详解一、综述WAVE文件作为多媒体中使用声波文件格式之一,它是以RIFF格式为标准。RIFF是英文ResourceInterchangeFileFormat缩写,每个WAVE文件头四个字节便是“RIFF”。WAVE文件是由若干个Chunk组成。按照在文件中出现位置包含:RIFFWAVEChunk,FormatChunk,FactChunk(可选),DataChunk。详细见下列图:------------------------------------------------|RIFFWAVEChunk||ID='RIFF'||RiffType='WAVE'|------------------------------------------------|FormatChunk||ID='fmt'|------------------------------------------------|FactChunk(optional)||ID='fact'|------------------------------------------------|DataChunk||ID='data'|------------------------------------------------图1Wav格式包含Chunk示例其中除了FactChunk外,其余三个Chunk是必须。每个Chunk有各自ID,位于Chunk最开始位置,作为标示,而且均为4个字节。而且紧跟在ID后面是Chunk大小(去除ID和Size所占字节数后剩下其余字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。下面详细介绍各个Chunk内容。PS:全部数值表示均为低字节表示低位,高字节表示高位。二、详细介绍RIFFWAVEChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'RIFF'|----------------------------------|Size|4Bytes||----------------------------------|Type|4Bytes|'WAVE'|----------------------------------图2RIFFWAVEChunk以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID和Size所占用字节数,即FileLen-8=Size。然后是Type字段,为'WAVE',表示是wav文件。结构定义以下:structRIFF_HEADER{charszRiffID[4];//'R','I','F','F'DWORDdwRiffSize;charszRiffFormat[4];//'W','A','V','E'};FormatChunk====================================================================||字节数|详细内容|====================================================================|ID|4Bytes|'fmt'|--------------------------------------------------------------------|Size|4Bytes|数值为16或18,18则最终又附加信息|------------------------------------------------------------------------|FormatTag|2Bytes|编码方式,通常为0x0001||--------------------------------------------------------------------||Channels|2Bytes|声道数目,1--单声道;2--双声道||--------------------------------------------------------------------||SamplesPerSec|4Bytes|采样频率||--------------------------------------------------------------------||AvgBytesPerSec|4Bytes|每秒所需字节数||===>WAVE_FORMAT--------------------------------------------------------------------||BlockAlign|2Bytes|数据块对齐单位(每个采样需要字节数)||--------------------------------------------------------------------||BitsPerSample|2Bytes|每个采样需要bit数||--------------------------------------------------------------------|||2Bytes|附加信息(可选,经过Size来判断有没有)||------------------------------------------------------------------------图3FormatChunk以'fmt'作为标示。通常情况下Size为16,此时最终附加信息没有;假如为18则最终多了2个字节附加信息。主要由一些软件制成wav格式中含有该2个字节附加信息。结构定义以下:structWAVE_FORMAT{WORDwFormatTag;WORDwChannels;DWORDdwSamplesPerSec;DWORDdwAvgBytesPerSec;WORDwBlockAlign;WORDwBitsPerSample;};structFMT_BLOCK{charszFmtID[4];//'f','m','t',''DWORDdwFmtSize;WAVE_FORMATwavFormat;};FactChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'fact'|----------------------------------|Size|4Bytes|数值为4|----------------------------------|data|4Bytes||----------------------------------图4FactChunkFactChunk是可选字段,通常当wav文件由一些软件转化而成,则包含该Chunk。结构定义以下:structFACT_BLOCK{charszFactID[4];//'f','a','c','t'DWORDdwFactSize;};DataChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'data'|----------------------------------|Size|4Bytes||----------------------------------|data|||----------------------------------图5DataChunkDataChunk是真正保留wav数据地方,以'data'作为该Chunk标示。然后是数据大小。紧接着就是wav数据。依照FormatChunk中声道数以及采样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(右)|||(低位字节)|(高位字节)|(低位字节)|(高位字节)|---------------------------------------------------------------------图6wav数据bit位置安排方式DataChunk头结构定义以下:structDATA_BLOCK{charszDataID[4];//'d','a','t','a'DWORDdwDataSize;};三、小结所以,依照上述结构定义以及格式介绍,很轻易编写对应wav格式解析代码。这里详细代码就不给出了。四、参考资料1、李敏,声频文件格式WAVE转换,电脑知识与技术(学术交流),.2、3、太感激你了,我说我写WAV头文件分析怎么老是出些以外情况,原来找资料思绪就不对,哪个货写,没水平写毛,误人子弟原来资料是这么,大家注意,不要学啊wav头格式是一定,其详细格式见DirectShow给出例子wavdest中StopStreaming函数!是58个字节,有44个。长度类型说明单个数据类型字节*个数1*44Char[4]格式标志“RIFF”4*14Long文件长度(比实际长度小8)1*44Char[4]WAVE标志“WAVE”1*44Char[4]Fmt标志“FMT”4*14Long以下描述占用空间//剩下头文件大小2*12ShortWAVE格式类别2*12Short声道数4*14Long采样率4*14Long数据传送率2*12Short块调整值2*12Short采样位数2*12Short暂时未用,值为01*44Char[4]暂时未用,值为“fact”4*14LongWAVE标志,值为41*44Char[4]暂时未用1*44Char[4]DATA标志,“data”4*14Long数据区长度WAV文件格式-08-2518:39:03|分类:\o"音频研究"音频研究|标签:|字号大中小订阅一、WAV格式即使会议系统完成后我们能直接向声卡拿到PCM数据,但毕竟我们现在拿到手是WAV文件,我们要识别这种格式头文件。下面是一编转自其它网站《WAV格式详解》(有一定修改)1、综述WAVE文件作为多媒体中使用声波文件格式之一,它是以RIFF格式为标准。RIFF是英文ResourceInterchangeFileFormat缩写,每个WAVE文件头四个字节便是“RIFF”。WAVE文件是由若干个Chunk组成。按照在文件中出现位置包含:RIFFWAVEChunk,FormatChunk,FactChunk(可选),DataChunk。详细见下列图:------------------------------------------------|RIFFWAVEChunk||ID='RIFF'||RiffType='WAVE'|------------------------------------------------|FormatChunk||ID='fmt'|------------------------------------------------|FactChunk(optional)||ID='fact'|------------------------------------------------|DataChunk||ID='data'|------------------------------------------------图1Wav格式包含Chunk示例其中除了FactChunk外,其余三个Chunk是必须。每个Chunk有各自ID,位于Chunk最开始位置,作为标示,而且均为4个字节。而且紧跟在ID后面是Chunk大小(去除ID和Size所占字节数后剩下其余字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。下面详细介绍各个Chunk内容。PS:全部数值表示均为低字节表示低位,高字节表示高位。2、详细介绍RIFFWAVEChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'RIFF'|----------------------------------|Size|4Bytes||----------------------------------|Type|4Bytes|'WAVE'|----------------------------------图2RIFFWAVEChunk以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID和Size所占用字节数,即FileLen-8=Size。然后是Type字段,为'WAVE',表示是wav文件。FormatChunk====================================================================||字节数|详细内容|====================================================================|ID|4Bytes|'fmt'|--------------------------------------------------------------------|Size|4Bytes|数值为16或18,18则最终又附加信息|------------------------------------------------------------------------|FormatTag|2Bytes|编码方式,通常为0x0001||--------------------------------------------------------------------||Channels|2Bytes|声道数目,1--单声道;2--双声道||--------------------------------------------------------------------||SamplesPerSec|4Bytes|采样频率||--------------------------------------------------------------------||AvgBytesPerSec|4Bytes|每秒所需字节数||===>WAVE_FORMAT--------------------------------------------------------------------||BlockAlign|2Bytes|数据块对齐单位(每个采样需要字节数)||--------------------------------------------------------------------||BitsPerSample|2Bytes|每个采样需要bit数||--------------------------------------------------------------------|||2Bytes|附加信息(可选,经过Size来判断有没有)||------------------------------------------------------------------------图3FormatChunk以'fmt'作为标示。通常情况下Size为16,此时最终附加信息没有;假如为18,则最终多了2个字节附加信息。主要由一些软件制成wav格式中含有该2个字节附加信息。FactChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'fact'|----------------------------------|Size|4Bytes|数值为4|----------------------------------|data|4Bytes||----------------------------------图4FactChunkFactChunk是可选字段,通常当wav文件由一些软件转化而成,则包含该Chunk。DataChunk==================================||所占字节数|详细内容|==================================|ID|4Bytes|'data'|----------------------------------|Size|4Bytes||----------------------------------|data|||----------------------------------图5DataChunkDataChunk是真正保留wav数据地方,以'data'作为该Chunk标示。然后是数据大小。紧接着就是wav数据。依照FormatChunk中声道数以及采样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(右)|||(低位字节)|(高位字节)|(低位字节)|(高位字节)|---------------------------------------------------------------------图6wav数据bit位置安排方式3、小结所以,依照上述结构定义以及格式介绍,很轻易编写对应wav格式解析代码。这里详细代码就不给出了。二、代码实现依照上面格式要求,我们把它写成一头文件wav.h1#ifndef_WAV_H_2#define_WAV_H_34#include"types.h"56#pragmapack(1)78structRIFF_HEADER9{10U8szRiffID[4];//'R','I','F','F'11U32dwRiffSize;12U8szRiffFormat[4];//'W','A','V','E'13};1415structWAVE_FORMAT16{17U16wFormatTag;18U16wChannels;19U32dwSamplesPerSec;20U32dwAvgBytesPerSec;21U16wBlockAlign;22U16wBitsPerSample;23U16pack;//附加信息24};25structFMT_BLOCK26{27U8szFmtID[4];//'f','m','t',''28U32dwFmtSize;29structWAVE_FORMATwavFormat;30};3132structFACT_BLOCK33{34U8szFactID[4];//'f','a','c','t'35U32dwFactSize;36};3738structDATA_BLOCK39{40U8szDataID[4];//'d','a','t','a'41U32dwDataSize;42};434445#endif因为这是个简单程序,我没有去规划,相就WAV解码过程我放到main.cmain函数里做了,这是不应该,请原谅1/*******************************************************2*这是配合我博客《JRTPLIB@ConferenceDIY视频会议系统》3*而写一个阶段性试验。4*作者:冯富秋tinnal5*邮箱:6*博客:.com/tinnal/7*目期:-01-038*版本:1.009*********************************************************/1011#include"stdio.h"12#include"string.h"13#include"types.h"14#include"g711.h"15#include"wav.h"1617structRIFF_HEADERriff_header;18structFMT_BLOCKfmt_block;19charfack_block_buffer[20];//20shouldbeenough20structFACT_BLOCKfact_block;21structDATA_BLOCKdata_block;2223intmain(intargc,char**argv)24{25FILE*wav_in;26FILE*wav_out;27U32i;28U8has_fact_block=0;2930unsignedcharpcm_bytes[2];31shortpcm;32unsignedchara_law;3334longfile_pos;3536if(argc!=3)37{38printf("Usage:\n\t%s<intputfile><outputfile>\n",argv[0]);39exit(-1);40}4142wav_in=fopen(argv[1],"rb");43if(wav_in==NULL)44{45printf("Can'topeninputfile%s\n",argv[1]);46return(-1);47}4849wav_out=fopen(argv[2],"wb");50if(wav_out==NULL)51{52printf("Can'topenoutputfile%s\n",argv[2]);53fclose(wav_in);54return(-1);55}5657file_pos=ftell(wav_in);5859//ReadRIFF_HEADER60fread(&riff_header,sizeof(structRIFF_HEADER),1,wav_in);61if(memcmp(riff_header.szRiffID,"RIFF",4)!=0||62memcmp(riff_header.szRiffFormat,"WAVE",4)!=0)63{64printf("Noavaildwavefile!\n");65fclose(wav_in);66fclose(wav_out);67return(-1);68}69file_pos=ftell(wav_in);7071//ReadFMT_BLOCK72fread(&fmt_block,sizeof(structFMT_BLOCK),1,wav_in);73if(memcmp(fmt_block.szFmtID,"fmt",4)!=0||74fmt_block.dwFmtSize!=18||75fmt_block.wavFormat.wFormatTag!=0x1||76fmt_block.wavFormat.wChannels!=0x1||77fmt_block.wavFormat.dwSamplesPerSec!=8000||78fmt_block.wavFormat.wBitsPerSample!=16)79{80printf("Sorrythisisonlytestprogram,\n"81"weonlysupportfollowformat,\n"82"\t1.Format:linearPCM\n"83"\t2.SamplesRate:8000KHz\n"84"\t3.Channels:onechannel\n"85"\t4.BitsPerSample:16\n");86fclose(wav_in);87fclose(wav_out);88return(-1);89}9091file_pos=ftell(wav_in);9293//TrytoreadFACT_BLOCK94file_pos=ftell(wav_in);95fread(&fact_block,sizeof(structFACT_BLOCK),1,wav_in);96if(memcmp(fact_block.szFactID,"fact",4)==0)97{98has_fact_block=1;99fread(&fack_block_buffer,fact_block.dwFactSize,1,wav_in);100}101else102fseek(wav_in,file_pos,SEEK_SET);103104fread(&data_block,sizeof(structDATA_BLOCK),1,wav_in);105if(memcmp(data_block.szDataID,"data",4)!=0)106{107printf("OOhwhaterror?\n");108fclose(wav_in);109fclose(wav_out);110return(-1);111}112113//Changethewaveheadertowrite114riff_header.dwRiffSize-=data_block.dwDataSize/2;115116fmt_block.wavFormat.wFormatTag=0x06;117fmt_block.wavFormat.wChannels=0x01;118fmt_block.wavFormat.dwSamplesPerSec=8000;119fmt_block.wavFormat.dwAvgBytesPerSec=8000;120fmt_block.wavFormat.wBlockAlign=0x01;121fmt_block.wavFormat.wBitsPerSample=0x08;122123data_block.dwDataSize-=data_block.dwDataSize/2;124125//Writewavefileheader126fwrite(&riff_header,sizeof(structRIFF_HEADER),1,wav_out);127fwrite(&fmt_block,sizeof(structFMT_BLOCK),1,wav_out);128if(has_fact_block==1)129{130fwrite(&fact_block

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论