




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 WAVE文件格式剖析WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文ResourceInterchangeFileFormat的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFFWAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。WAVE文件格式说明表偏移地址字节数数据类型内容文件头00H4charRIFF标志04H4longint文件长度08H4charWAVE标志0CH4charfmt标志10H4过渡字节(不定)14H2int格式类别(10H为PCM形式的声音数据)16H2int通道数,单声道为1,双声道为218H2int采样率(每秒样本数),表示每个通道的播放速度,1CH4longint波形音频数据传送速率,其值为通道数每秒数据位数每样本的数据位数8。播放软件利用此值可以估计缓冲区的大小。20H2int数据块的调整数(按字节算的),其值为通道数每样本的数据位值8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。22H2每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。24H4char数据标记符data28H4longint语音数据的长度PCM数据的存放方式:样本1样本28位单声道0声道0声道8位立体声0声道(左)1声道(右)0声道(左)1声道(右)16位单声道0声道低字节0声道高字节0声道低字节0声道高字节16位立体声0声道(左)低字节0声道(左)高字节1声道(右)低字节1声道(右)高字节WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。样本大小数据格式最大值最小值8位PCMunsignedint225016位PCMint32767-32767二、 / 是个很专业的技术社区/blog三、参考程序type TMyWaveFormat=record FieldLabel:array0.3 of Char; / RIFF FieldLen:DWORD; /从08H开始到文件末尾字节数 WaveID:array0.3 of Char; / WAVE 57 41 56 45 FmtID:array0.3 of Char; / fmt 66 6D 74 20 FmtLen:DWORD; /A_LAW 12 00 00 00 PCM 10 00 00 00 wFormatTag: Word; / format type A_LAW 06 00 PCM 01 00 nChannels: Word; / 声道数 01 00 nSamplesPerSec: DWORD; / sample rate 采样率 40 1F 00 00 nAvgBytesPerSec: DWORD; / for buffer estimation 每秒平均字节数 40 1F 00 00 nBlockAlign: Word; / block size of data 块调整 01 00 wBitsPerSample: Word; /采样BITS数 08 00 DataID:array0.3 of Char; / data 64 61 74 61 DataLen:DWORD; / 采样数据总字节数 end;四、各种WAV文件头格式 Wav文件也分好几个种类,相应的非数据信息存储在文件头部分,以下是各种WAV文件头格式。表18KHz采样、16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint10000000H(PCM)longintsize1=0x1014H2int0100Hintfmttag=0x0116H2intintchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=声道数*量化数/822H2int量化数intbitpersamples=8或1624H4chardatachardata_id=data28H4longint采样数据字节数longintsize2=文长-442CH到文尾char采样数据表28KHz采样、8比特A律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint12000000H(ALAW)longintsize1=0x1214H2int0600Hintfmttag=0x0616H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=0x0122H4longint量化数longintbitpersamples=826H4charfactcharwave_fact=fact2AH8char0400000000530700H定chartemp32H4chardatacharwave_data=data36H4longint采样数据字节数lontintsize2=文长-58表38KHz采样、8比特U律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint12000000H(ULAW)longintsize1=0x1214H2int0700Hintfmttag=0x0716H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=0x0122H4longint量化数longintbitpersamples=826H4charfactcharwave_fact=fact2AH8char0400000000530700H定chartemp32H4chardatacharwave_data=data36H4longint采样数据字节数lontintsize2=文长-58表4ADPCM语音编码后的WAVE文件头格式表(共90字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint32000000H(ADPCM)longintsize1=0x3214H2int0200Hintfmttag=0x0216H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=声道数*量化数/822H2int量化数intbitpersamples=424H34char固定字节chartemp146H4charfactcharwave_fact=fact4AH8char0400000004930600H定chartemp252H4chardatacharwave_data=data56H4longint采样数据字节数lontintsize2=文长-905AH到文尾采样数据表5GSM语音编码后的WAVE文件头格式表(共60字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint14000000H(GSM)longintsize1=0x1414H2int3100Hintfmttag=0x3116H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H8char4100000002004001H定chartemp128H8char6661637404000000H定chartemp230H4char40E20500H定chartemp334H4chardatacharwave_data=data38H4longint采样数据字节数lontintsize2=文长-603CH到文尾采样数据表6SBC语音编码后的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint12000000H(SBC)longintsize1=0x1214H2int7100Hintfmttag=0x7116H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=0x2522H4longint量化数longintbitpersamples=1626H4charfactcharwave_fact=fact2AH8char0400000076280400H定chartemp32H4chardatacharwave_data=data36H4longint采样数据字节数lontintsize2=文长-59表7CELP语音编码后的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint12000000H(CELP)longintsize1=0x1214H2int7000Hintfmttag=0x7016H2int声道数intchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=0x0C22H4longint量化数longintbitpersamples=1626H4charfactcharwave_fact=fact2AH8char0400000060520700H定chartemp32H4chardatacharwave_data=data36H4longint采样数据字节数lontintsize2=文长-58WAVEFORMATEXtypedefstructWORDwFormatTag;WORDnChannels;DWORDnSamplesPerSec;DWORDnAvgBytesPerSec;WORDnBlockAlign;WORDwBitsPerSample;WORDcbSize;WAVEFORMATEX;具体参数解释如下:wFormatTag:波形数据的格式,定义在MMREG.H文件中nChannels:波形数据的通道数:单声道或立体声nSamplesPerSec:采样率,对于PCM格式的波形数据,采样率有8.0kHz,11.025kHz,22.05kHz,44.1kHz等nAvgBytesPerSec:数据率,对于PCM格式的波形数据,数据率等于采样率乘以每样点字节数nBlockAlign:每个样点字节数wBitsPerSample:采样精度,对于PCM格式的波形数据,采样精度为8或16cbSize:附加格式信息的数据块大小概念2、定义设备头结构WAVEHDR定义了指向波形数据缓冲区的设备头。WAVEHDRtypedefstructLPSTRlpData;DWORDdwBufferLength;DWORDdwBytesRecorded;DWORDdwUser;DWORDdwFlags;DWORDdwLoops;structwavehdr_tag*lpNext;DWORDreserved;WAVEHDR;lpData:波形数据的缓冲区地址dwBufferLength:波形数据的缓冲区地址的长度dwBytesRecorded:当设备用于录音时,标志已经录入的数据长度dwUser:用户数据dwFlags:波形数据的缓冲区的属性dwLoops:播放循环的次数,仅用于播放控制中lpNext和reserved均为保留值注意:上述结构体以及我们在程序中所使用到的“HWAVEIN”HWAVEOUT”结构体均是系统已经存在的,我们只需要对其进行赋值即可。五、本文就经常见的一种格式PCM(44字节)的Wav文件头进行分析一.解析文件头表18KHz采样、16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节)偏移地址字节数数据类型内容文件头定义为00H4charRIFFcharriff_id4=RIFF04H4longint文件总长-8longintsize0=文总长-808H8charWAVEfmtcharwave_fmt810H4longint10000000H(PCM)longintsize1=0x1014H2int0100Hintfmttag=0x0116H2intintchannel=1或218H4longint采样率longintsamplespersec1CH4longint每秒播放字节数longintbytepersec20H2int采样一次占字节数intblockalign=声道数*量化数/822H2int量化数intbitpersamples=8或1624H4chardatachardata_id=data28H4longint采样数据字节数longintsize2=文长-442CH到文尾char采样数据举例说明:kugoo下载的一首wav文件:魏三 抹去泪水 wav.wav(大小14,703,980 字节,时长2:46),文件头如下:1.地址00H-03H,值为“RIFF”标志;2.地址04H-07H,值为“64 5D E0 00”,存储的是文件大小刨去8字节后的值,注意这个是little-endian的,也就是高地址存低位,地地址存高位,所以Size=00E05D64H=14703972字节,比文件总大小少8个字节,这8个字节就是00H-07H。3.地址08H-0FH,就是“WAVEfmt ”标记。4.地址10H-13H,fmt格式的块大小,这种格式时是“10 00 00 00”,也是little-endian的,即块大小为16,也有可能为18,这时最后多了2个字节的附加信息。其他格式的可能是20。5.地址14H-15H,“01 00”,也是little-endian的,标记编码方式,一般为0x0001。6.地址16H-17H,“01 00”,也是little-endian,标记声道数,这里值为1。注意1代表单声道,2代表双声道。7.地址18H-1BH,“44 AC 00 00”,也是little-endian,标记采样频率,这里为441000Hz。8.地址1CH-1FH,“88 5801 00”每秒所需的字节数,也是little-endian,bytepersec=00015888H=88200(字节)。【加上点自己的看法 88200=频率*采样一次占的字节数=44100*2,我觉得这种关系是存在的,虽然很多资料上没提到)。9.地址20H-21H,“02 00”,采样一次占字节数,有些地方也叫数据块对齐单位,也是little-endian的,这里是两个字节。声道数*量化数/8=1*16/8=2(字节)。10.地址22H-23H,“10 00”,量化数,也就是每个采样需要的bit数,也是little-endian的,所以这里是16位。11.地址24H-27H,“64 61 74 61”,就是“data”了。12.地址28H-2BH,“40 5D E0 00”,存储的是文件大小刨去44字节后的值,这个也是little-endian的,Size=00E05D40H=14703936字节。二、编程方法1.计算文件播放时长文件播放时长=(文件总长度-文件头长度)/每秒所需的字节数。如上例 duration=(14,703,980 -44)/88200=166.7s,这个在kugoo的制作铃声功能下可以查询的到。2.按时间点切割文件(只精确到秒已用程序实现过,精确到0.1s理论上也是可以,但是没有用程序去实现)2.1 切割文件的前N秒为一个新文件 第一步,计算N秒的偏移量,SetOff=N*每秒所需的字节数 第二步,算出新文件的大小,修改文件头的两个size值。 第三步,新的文件头以二进制形式写入到新文件,紧接着根据偏移量把原文件中的第45字节到(setOff-1)字节写入到新文件。2.2 窃取中间某个时间段为一个新文件 这里可以根据2.1的步骤进行,同样的要修改文件头。六、WAV文件格式知识(/)WAV是一种由微软公司开发的文件格式,符合RIFF(ResourceInterchange
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 超简单的两人合伙协议范本
- 小学一年级上学期体育教学工作总结
- 光的干涉教案
- 项目工程管理策划书
- 学校舆情信息收集工作制度
- 北师大版《-长方形的面积》大型赛课教学设计
- 2025临时仓库租用合同模板
- vr设计制作合同标准文本
- KTV清洁合同样本
- 灾害性天气应急预案
- 软件代码审计与测试作业指导书
- 上消化道出血护理疑难病例讨论记
- 城市轨道交通自动售票机
- 环境设计专业考察课程教学大纲
- 2024版互联网企业股东合作协议书范本3篇
- 企业环保知识培训课件
- 110kV立塔架线安全施工方案
- 完形填空-2025年安徽中考英语总复习专项训练(含解析)
- 《岁末年初重点行业领域安全生产提示》专题培训
- 商混站(商品混凝土公司)安全风险分级管控和隐患排查治理双体系方案全套资料汇编完整版
- GB/T 16288-2024塑料制品的标志
评论
0/150
提交评论