详解wave头格式(尽可能详细并附代码)
wave文件格式以及代码
wave⽂件格式以及代码⼀、综述WAVE⽂件作为多媒体中使⽤的声波⽂件格式之⼀,它是以RIFF格式为标准的。
RIFF是英⽂Resource Interchange File Format的缩写,每个WAVE⽂件的头四个字节便是“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'------------------------------------------------图1 Wav格式包含Chunk⽰例其中除了Fact Chunk外,其他三个Chunk是必须的。
每个Chunk有各⾃的ID,位于Chunk最开始位置,作为标⽰,⽽且均为4个字节。
并且紧跟在ID后⾯的是Chunk⼤⼩(去除ID和Size所占的字节数后剩下的其他字节数⽬),4个字节表⽰,低字节表⽰数值低位,⾼字节表⽰数值⾼位。
下⾯具体介绍各个Chunk内容。
Wave文件格式解析
Wave文件是用于多媒体文件存储的Microsoft RIFF(Resource Interchange File Format 资源交换档案标准)规范的子集之一。
一个RIFF文件以一个文件头(File Header)开始,接着是一系列数据块(data chunk)。
一个Wave文件常常是一个带有一个单“WAVE”块的RIFF文件。
该“WAVE”chunk由两个子快组成,一个“fmt”chunk用于详细说明数据格式,一个“data”chunk包含实际的样本数据。
这种形式我们称为规范形式。
下面我们看一个具体的例子,声音文件如下:
52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00
22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00
24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d
上图所示例子,该WAVE文件采用PCM编码。
该音频具有双声道,每个样点进行16位量化编码,双声道的一个样点占4字节,存储顺序是每个样点的左右声道交替存储。
对于Data块,根据声道数和采样率的不同情况,布局如下(每列代表8bits):1、8 Bit 单声道:
2、8 Bit 双声道
3、16 Bit 单声道:
4、16 Bit 双声道。
WAV文件格式分析与详解
WAV文件格式分析与详解作者:王若钧何杉来源:《数字技术与应用》2014年第03期摘要:WAV文件格式信息是对WAV文件编程的重要依据。
揭开WAV文件格式的奥秘是开发功能强大的具有自主知识产权的语音处理软件的关键。
本文结合波形文件的基本知识,较系统地说明了WAV文件的存储原理、文件结构、WAV文件头格式、基于PCM编码的数据组织,内容全面、清楚、准确,还包含了一些新汇集的参数。
可作为开发人员的参考资料。
关键词:文件格式 WAV 编码声音中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2014)03-0093-021 引言WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。
WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统,详述如下。
2 波形文件的基础知识2.1 波形文件的存储过程声源发出的声波通过话筒被转换成连续变化的电信号,经过放大、抗混叠滤波后,按固定的频率进行采样,每个样本是在一个采样周期内检测到的电信号幅度值;接下来将其由模拟电信号量化为由二进制数表示的积分值;最后编码并存储为音频流数据。
有的应用为了节省存储空间,存储前,还要对采样数据先进行压缩。
2.2 WAV文件的编码编码包括了两方面内容,一是按一定格式存储数据,二是采用一定的算法压缩数据。
WAV格式对音频流的编码没有硬性规定,支持非压缩的PCM(Puls Code Modulation)脉冲编码调制格式,还支持压缩型的微软自适应差分脉冲编码调制Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、国际电报联盟(International Telegraph Union)制定的语音压缩标准ITU G.711 a-law、ITU G.711-law、IMA ADPCM、ITU G.723 ADPCM (Yamaha)、GSM 6.10、ITU G.721 ADPCM编码和其它压缩算法。
详解wave头格式(尽可能详细并附代码)
整理网上和读书时的资料,结合自己的实际经验,给出wav头格式的解释和源代码,既是对自己的总结,同时又服务大家。
另外在给出几个实际例子,如果看了这篇文档还不能正确写出wave文件,那就要吊起来打了^_^。
——flywen 2010-10-13参考网址一:/sshcx/archive/2007/05/01/1593923.aspx参考网址二:/share/detail/15909594WAVE 文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF"。
WAVE 文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF/WAV文件 标识段和声音数据格式说明段两部分。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。
采样率是指:声音信号在"模→数"转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
[!21ki@][@21ki!]对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。
WAVE文件是由样本组织而成的。
在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。
在多声道WAVE文件中,样本是交替出现的。
参考网址一和二中都给出了wav的头定义,但有一个小区别,一中将这个44个字节作为一个大的头,给定在一个结构体中,而二中则是按照四个不同的chunk处理的,所以就给了四个结构体,后面我的代码也是根据二来写的,个人觉得这样比较清晰,不过这纯属个人感觉。
Wave文件格式解析
Wave文件是用于多媒体文件存储的Microsoft RIFF(Resource Interchange File Format 资源交换档案标准)规范的子集之一。
一个RIFF文件以一个文件头(File Header)开始,接着是一系列数据块(data chunk)。
一个Wave文件常常是一个带有一个单“WAVE”块的RIFF文件。
该“WAVE”chunk由两个子快组成,一个“fmt”chunk用于详细说明数据格式,一个“data”chunk包含实际的样本数据。
这种形式我们称为规范形式。
下面我们看一个具体的例子,声音文件如下:
52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00
22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00
24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d
上图所示例子,该WAVE文件采用PCM编码。
该音频具有双声道,每个样点进行16位量化编码,双声道的一个样点占4字节,存储顺序是每个样点的左右声道交替存储。
对于Data块,根据声道数和采样率的不同情况,布局如下(每列代表8bits):1、8 Bit 单声道:
2、8 Bit 双声道
3、16 Bit 单声道:
4、16 Bit 双声道。
WAV文件的头信息
{
char cRiffFlag[4];
UIN32 nFileLen;
char cWaveFlag[4];
char cFmtFlag[4];
char cTransition[4];
UIN16 nFormatTag ;
UIN16 nChannels;
04H 4 long int 文件长度
08H 4 char "WAVE"#34;标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度, (Hz) sample frequency
UIN16 nSamplesPerSec;
UIN32 nAvgBytesperSec;
UIN16 nBlockAlign;
UIN16 nBitNumPerSample;
char cDataFlag[4];
UIN16 nAudioLength;
} WAVEFORMAT;
16位PCM int 32767 -32767
///////////////////////////////////////////////////////////////////////下面是常用来表示的数据结构
unsigned short tag; /* MS PCM = 1 */
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒样本数×每样本的数据位数(bit)/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
解读Wave文件头结构
解读Wave,文件头解释,可以用16位编辑器UltraEdit打开,然后可以观察文件的结构。
我发现对应C语言里面的字WORD(32位),16进制文件对应2个字节(Byte),而DWORD(64位),对应4个字节。
然后顺便普及一下16进制文件的存储规律,对于WORD,先存储低位字节,然后存储高位字节,而DWORD,则先存储低两位的低位,然后是低两位的高位,然后是高两位的低位,然后是高两位的高位。
介绍一下W A VE文件的结构:标志符(RIFF)数据大小格式类型("W A VE")"fmt"Sizeof(PCMW A VEFORMAT)PCMW A VEFORMAT"data"声音数据大小声音数据查到C语言中对应的W A V的文件头结构如下:Typedef struct{W A VEFORMAT wf;//波形格式;WORD wBitsPerSample;//W A VE文件的采样大小;}PCMW A VEFORMAT;W A VEFORMAT结构定义如下:typedef struct{WORD wFormatag;//编码格式,包括W A VE_FORMAT_PCM,W A VEFORMAT_ADPCM等WORD nChannls;//声道数,单声道为1,双声道为2;DWORD nSamplesPerSec;//采样频率;DWORD nAvgBytesperSec;//每秒的数据量;WORD nBlockAlign;//块对齐;}W A VEFORMAT;然后我们根据实际的一个文件的文件头进行对比分析,然后大家就应该明白了:首先是一串“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个W A VE文件头。
然后是“E4 3C 00 00”,这个是我这个W A V文件的数据大小,记住这个大小是包括头文件的一部分的,包括除了前面8个字节的所有字节,也就等于文件总字节数减去8。
WAVE文件格式分析
WAVE文件格式分析
WAVE文件格式是一种用于存储音频数据的文件格式,它是由微软和IBM共同开发的,是Windows操作系统中普遍使用的音频文件格式之一、WAVE是英文"Waveform Audio File Format"的缩写,意为波形音频文件格式。
在WAVE文件的数据部分,音频采样数据以二进制形式存储。
每一个采样值表示了音频信号在特定时间点上的振幅。
振幅大小由采样的位数决定,常见的位数包括8位、16位、24位和32位。
位数越大,表示的振幅范围越广,音质也越高,但同时也会占用更多的存储空间。
此外,WAVE文件还支持多通道音频数据的存储,如立体声、环绕声等。
多通道的音频数据将各个通道的音频采样值依次交错存储,以便于播放软件正确解析和处理多通道的音频数据。
总结起来,WAVE文件格式是一种无损音频文件格式,能够保存音频的完整信息。
它采用了无压缩的PCM编码方式,可以保存各种音频属性的数值,并支持多通道的音频数据存储。
此外,WAVE文件还支持附加信息的存储,提供了便于操作和管理音频文件的功能。
因此,WAVE文件格式在音频文件存储与处理中具有广泛的应用价值。
wav文件文件头格式
一、WAVE文件格式剖析WA VE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文ResourceInterchangeFileFormat的缩写,每个W A VE文件的头四个字节便是“RIFF”。
WA VE文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF/WAV 文件标识段和声音数据格式说明段两部分。
W A VE文件各部分内容及格式见附表。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WA VE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。
W A VE文件是由样本组织而成的。
在单声道W A VE文件中,声道0代表左声道,声道1代表右声道。
在多声道W A VE文件中,样本是交替出现的。
WA VE文件格式说明表偏移地址字节数数据类型内容文件头00H4char"RIFF"标志04H4longint文件长度08H4char"WA VE"标志0CH4char"fmt"标志10H4过渡字节(不定)14H2int格式类别(10H为PCM形式的声音数据)16H2int通道数,单声道为1,双声道为218H2int采样率(每秒样本数),表示每个通道的播放速度,1CH4longint波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。
播放软件利用此值可以估计缓冲区的大小。
20H2int数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。
WAVE文件的头文件定义
WAVE文件的头文件定义typedef struct _TWavHeader{long rId;long rLen;long wId;long fId;long fLen;WORD wFormatT ag;WORD nChannels;long nSamplesPerSec;long nAvgBytesPerSec;WORD nBlockAlign;WORD wBitsPerSample;long dId;long wSampleLength;}TWavHeader;TWavHeader wh;wh.rId = 0x46464952;wh.rLen = 36;wh.wId = 0x45564157;wh.fId = 0x20746d66;wh.fLen = 16;wh.wFormatTag = 1;wh.nChannels = wChannels;wh.nSamplesPerSec = lRate;wh.nAvgBytesPerSec = wChannels * lRate * (wResolu tion / 8);wh.nBlockAlign = wChannels * (wResolution / 8);wh.wBitsPerSample = wResolution;wh.dId = 0x61746164;wh.wSampleLength = 0;int nHandle = FileCreate(strFileName);FileSeek(nHandle, 0, 0);FileWrite(nHandle, &wh, sizeof(wh));FileClose(nHandle);===================================== wav文件包括头和数据两部分,其结构如下:(从文件头开始依次排列)1)首先是字符串“RIFF”,占4个字节。
2)波形块的大小:DWORD,占4字节。
Wave文件格式
WAV简介WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器。
通常使用三个参数来表示声音,量化位数,取样频率和声道数。
声道有单声道和立体声之分,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种,不过尽管音质出色,但在压缩后的文件体积过大!相对其他音频格式而言是一个缺点,其文件大小的计算方式为:WAV格式文件所占容量 = (取样频率 X 量化位数 X 声道) X 时间 / 8 (字节 = 8bit)目前支持WAV设计的手机主要为智能手机,如索尼爱立信P910和诺基亚N90以及采用微软OS的多普达等手机,而其它一些非智能手机的产品,如果宣传支持WAV格式则多半属于只是支持单声道的。
WAV剖析WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。
WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。
符合 PIFF Resource Interchange File Format规范。
所有的WAV都有一个文件头,这个文件头音频流的编码参数。
WAV文件作为最经典的Windows多媒体音频格式,应用非常广泛,它使用三个参数来表示声音:采样位数、采样频率和声道数。
声道有单声道和立体声之分,采样频率一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种。
wav文件的文件头信息详解
wav⽂件的⽂件头信息详解wav⽂件的⽂件头wave⽂件的格式:00H 4 char "RIFF"标志 04H 4 long int ⽂件长度 08H 4 char "WAVE"标志 0CH 4 char "fmt"标志 10H 4 过渡字节(不定) 14H 2 int 格式类别(10H为PCM形式的声⾳数据) 16H 2 int 通道数,单声道为1,双声道为2 18H 2 int 采样率(每秒样本数),表⽰每个通道的播放速度, 1CH 4 long int 波形⾳频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。
播放软件利⽤此值可以估计缓冲区的⼤⼩。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。
播放软件需要⼀次处理多个该值⼤⼩的字节数据,以便将其值⽤于缓冲区的调整。
22H 2 每样本的数据位数,表⽰每个声道中各个样本的数据位数。
如果有多个声道,对每个声道⽽⾔,样本⼤⼩都⼀样。
24H 4 char 数据标记符"data" 28H 4 long int 语⾳数据的长度楼主的帖⼦,⽂件头长度加起来是42字节,但是实际长度是44个字节(⽤UltraEdit打开⼀个WAVE⽂件,数⼀下就知道了)。
如果⽤以个结构体来定义WAVE⽂件头应该为: struct WAVEFILEHEADER { char chRIFF[4]; DWORD dwRIFFLen; char chWAVE[4]; char chFMT[4]; DWORD dwFMTLen; PCMWAVEFORMAT pwf; char chDATA[4]; DWORD dwDATALen; };但是实际测试,并不是所有的wave⽂件头都⼀样。
⽐较⿇烦的就是windows下⾃带的那个录⾳机录下的wav,⽂件头有58个Byte。
WAV文件解码
wav文件格式分析详解一、综述WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“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' |------------------------------------------------图1 Wav格式包含Chunk示例其中除了Fact Chunk外,其他三个Chunk是必须的。
每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。
并且紧跟在ID后面的是Chunk 大小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。
WAV文件文件头格式概述
WAV文件文件头格式概述1.RIFF标识符:占据4个字节,固定值为"RIFF",表示该文件是一个资源交换文件。
2.文件长度:占据4个字节,表示文件的总长度,包括文件头和音频数据。
3.WAVE标识符:占据4个字节,固定值为"WAVE",表示该文件是一个WAV文件。
4. fmt格式块标识符:占据4个字节,固定值为"fmt ",表示该块是格式块。
5.格式块大小:占据4个字节,表示格式块的大小。
6.音频格式:占据2个字节,表示音频数据的格式,常见的值为PCM (脉冲编码调制)。
7.通道数:占据2个字节,表示音频数据的通道数,常见的值为1(单声道)和2(立体声)。
9.数据传输率:占据4个字节,表示每秒的数据传输率。
10.数据块对齐:占据2个字节,表示音频数据块的对齐方式。
11.位深度:占据2个字节,表示音频数据的位深度,即每个样本的位数。
12. 数据标记符:占据4个字节,固定值为"data",表示下一个块是音频数据块。
13.音频数据长度:占据4个字节,表示音频数据块的长度。
14.音频数据:占据实际长度,表示音频的实际数据。
WAV文件头是一个固定长度为44个字节的结构,用于描述WAV文件的基本信息和格式。
每个字节都有特定的含义,包括文件类型标识、文件长度、音频格式、通道数、采样率、位深度等。
通过读取文件头,可以了解WAV文件的基本信息,并在解码和播放音频时进行相应的处理。
总体而言,WAV文件头格式提供了关于音频数据的基本信息,使得解码器和播放器能够正确处理和播放音频数据。
同时,WAV文件头的固定结构也使得该文件格式易于解析和处理。
WAVE头文件分析
typedef struct {char riff[4]; // RIFF file identification (4 bytes)0-3:RIFFlong length; // length field (4 bytes)4-7::0000b4c4(16进制)->46276(10进制):约等于45kb,此文件大小45.1kbchar wave[4]; // WAVE chunk identification (4 bytes)8-b:wave}WAVECHUNK;typedef struct{char fmt[4]; // format sub-chunk identification (4 bytes)b-f:fmt :注意,fmt后有空格long flength; // length of format sub-chunk (4 byte integer)10-13:未知含义short format; // format specifier (2 byte integer) [wFormatTag]14-15short chans; // number of channels (2 byte integer) [nChannels]16-17:声道数。
0001:1个声道long sampsRate; // sample rate in Hz (4 byte integer) [nSamplesPerSec]18-1b:1F40(16进制)-》8000(十进制):采样率long bpsec; // bytes per second (4 byte integer) [nAvgBytesPerSec]1c-1f:3e80(16进制)-》16000(十进制):一秒8000采样,一个采样16bit=2byte:8000*2 short bpsample; // bytes per sample (2 byte integer) [nBlockAlign]20-21:0002(16进制)-》2(十进制):一个采样点用2byte表示,就量化级为16bit short bpchan; // bits per channel (2 byte integer) [wBitsPerSample]22-23: 0010(16进制)-》16(十进制):一个信道:量化级为16bit}FMTCHUNK;typedef struct{char szFactID[4]; //'f','a','c','t'long dwFactSize; //the value is 4}FACTCHUNK;typedef struct{char data[4]; // data sub-chunk identification (4 bytes)24-27:datalong dlength; // length of data sub-chunk (4 byte integer)28-2b::0000b4a0(16进制)->46240(10进制):总文件长度-44byte。
WAVE文件格式解析
WAVE⽂件格式解析WAVE ⽂件作为Windows多媒体中使⽤的声⾳波形⽂件格式之⼀,它是以RIFF(Resource Interchange File Format)格式为标准的。
这⾥不针对RIFF⽂件格式做介绍,不太了解的可以参考“”⼀⽂。
WAVE⽂件构成每个WAVE⽂件的头四个字节便是“RIFF”。
WAVE ⽂件由⽂件头和数据体两⼤部分组成。
其中⽂件头⼜分为 RIFF/WAV ⽂件标识段和声⾳数据格式说明段两部分。
相对于RIFF⽂件,只是将“RIFF”chunk的form id替换为“WAVE”。
下表是⼀个典型的WAVE⽂件各部分构成及其长度字段。
注意所有数据采⽤windows默认的⼩端存储。
(FOURCC是⼀个特殊的四字节码,判断时按照字符顺序判断即可。
)域长度内容说明chunkID4Chunk ID: "RIFF",FOURCC四字节码chunksize4Chunk size: 4+nWAVEID4WAVE ID: "WAVE",FOURCC四字节码WAVE chunks n Wave chunks包含格式信息和⾳频采样数据,分为“format” chunk和“data”chunk两部分。
Format chunkFormat chunk⽤于说明data chunk中PCM数据的格式。
主要三种不同的format chunk格式(不同的格式码)。
如下表:域长度内容说明ckID4Chunk ID: "fmt ",FOURCC四字节码,注意最后⼀个填充是空格。
cksize4Chunk size: 16 or 18 or 40 wFormatTag2Format code,格式码nChannels2Number of interleaved channels,采样声道数(交织存储)nSamplesPerSec4Sampling rate (blocks per second),⾳频采样率nAvgBytesPerSec4Data rate,⾳频码率nBlockAlign2Data block size (bytes),⾳频数据块⼤⼩(单位字节)wBitsPerSample2Bits per sample,量化位数(⽐如8bits、16bits、32bits)cbSize2Size of the extension (0 or 22),扩展字段长度wValidBitsPerSample2Number of valid bits,有效的位长度dwChannelMask4Speaker position mask,声道描述掩码,⽐如左声道、右声道等SubFormat16GUID, including the data format code,数据格式码标准中定义的wFormatTag(Format code)可取值范围如下表:Format Code PreProcessor Symbol Data 0x0001WAVE_FORMAT_PCM PCM0x0003WAVE_FORMAT_IEEE_FLOAT IEEE float,[-1.0f,1.0f] 0x0006WAVE_FORMAT_ALAW8-bit ITU-T G.711 A-law 0x0007WAVE_FORMAT_MULAW8-bit ITU-T G.711 µ-law 0xFFFE WAVE_FORMAT_EXTENSIBLEDetermined by SubFormatPCM格式当wFormatTag为0x0001时,表⽰WAVE⽂件中存储的是PCM格式的⾳频数据。
WAV文件操作
WAVE文件格式剖析WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。
WAVE文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。
WAVE文件各部分内容及格式见附表。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。
WAVE文件是由样本组织而成的。
在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。
在多声道WAVE文件中,样本是交替出现的。
WAVE文件格式说明表PCM数据的存放方式:WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
运用多媒体WAV文件格式二三例 2000/11/20 软件世界徐济仁陈家松多媒体技术近年来发展很快,较好品质的声卡可以提供16位的立体声及44KHZ的播放录制能力,它不仅可以提供原音逼真的取样,其合成的音质也十分理想,有的声卡还加入了数字信号处理器,可编程控制的DSP具有强大的运算能力,它可以用来作声音信息的压缩和一些特殊效果的处理。
具有此功能的声卡提供的WAV文件提供的语音信息可以满足语音特征识别的要求。
详解RIFF和WAVE音频文件格式
详解RIFF和WAVE⾳频⽂件格式RIFF file formatRIFF全称为资源互换⽂件格式(Resources Interchange File Format),是Windows下⼤部分多媒体⽂件遵循的⼀种⽂件结构。
RIFF⽂件所包含的数据类型由该⽂件的扩展名来标识,能以RIFF格式存储的数据有:⾳频视频交错格式数据 .AVI波形格式数据 .WAV位图数据格式 .RDIMIDI格式数据 .RMI调⾊板格式 .PAL多媒体电影 .RMN动画光标 .ANI其他的RIFF⽂件 .BNDCHUNKchunk是RIFF⽂件的基本单元,其基本结构如下:struct chunk{uint32_t id; // 块标志uint32_t size; // 块⼤⼩uint8_t data[size]; // 块数据};id 4字节,⽤以标识块中所包含的数据。
如:RIFF,LIST,fmt,data,WAV,AVI等,由于这种⽂件结构最初是由Microsoft和IBM为PC机所定义,RIFF⽂件是按照⼩端 little-endian字节顺序写⼊的。
size 块⼤⼩存储在data域中的数据长度,不包含id和size的⼤⼩data 包含数据,数据以字为单位存放,如果数据长度为奇数(字节为单位),则最后添加⼀个空字节。
chunk是可以嵌套的,但是只有块标志为RIFF或者LIST的chunk才能包含其他的chunk。
RIFF chunk标志为RIFF的chunk是⽐较特殊的,每⼀个RIFF⽂件⾸先存放的必须是⼀个RIFF chunk,并且只能有这⼀个标志为RIFF的chunk。
RIFF的数据域的起始位置是⼀个4字节码(FOURCC),⽤于标识其数据域中chunk的数据类型;紧接着数据域的内容则是包含的subchunk,如下图这是⼀个RIFF chunk中包含有两个subchunk,可以看出RIFF chunk的数据域⾸先是是4字节的 Form Type,接着是两个subchunk,每⼀个subchun有包含有⾃⼰的标识、数据域的⼤⼩以及数据域。
WAV文件格式分析
WAV文件格式分析文件头是WAV文件的开头部分,它由44个字节组成,用于存储一些重要的文件信息。
文件头的具体内容如下:1. ChunkID (4 字节):用于标识文件类型,通常为 "RIFF";2. ChunkSize (4 字节):表示整个文件的大小,即文件头和音频数据部分的大小之和;3. Format (4 字节):表示文件格式,通常为 "WAVE";4. Subchunk1ID (4 字节):表示格式子块的标识,通常为 "fmt ";5. Subchunk1Size (4 字节):表示格式子块的大小,通常为 16;6. AudioFormat (2 字节):表示音频格式,1 表示 PCM (脉冲编码调制) 编码;7. NumChannels (2 字节):表示音频的声道数,通常为 1 (单声道) 或 2 (立体声);8. SampleRate (4 字节):表示采样率,即每秒采集的样本数;9. ByteRate (4 字节):表示数据传输速率,即每秒传输的字节数;10. BlockAlign (2 字节):表示块对齐,即每个采样的字节数;11. BitsPerSample (2 字节):表示每个样本的位数。
音频数据块是 WAV 文件中存储实际音频样本的部分。
它紧跟在文件头之后,其大小由 ChunkSize 字段确定。
音频数据以 PCM 编码保存,即将连续的音频采样以原始整数值的形式存储。
附加信息块(可选)是WAV文件中可以包含的附加信息部分。
它通常用于存储一些与音频相关的元数据,如歌曲名称、艺术家、专辑信息等。
附加信息块的大小和内容可以根据实际需要进行定义。
然而,WAV文件也存在一些限制和缺点。
首先,由于采样率、声道数和位深度等参数的限制,WAV文件可能占用较大的存储空间。
其次,相对于其他压缩格式如MP3,它的文件大小会更大,因此在网络传输和存储方面可能会受到限制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整理网上和读书时的资料,结合自己的实际经验,给出wav头格式的解释和源代码,既是对自己的总结,同时又服务大家。
另外在给出几个实际例子,如果看了这篇文档还不能正确写出wave文件,那就要吊起来打了^_^。
——flywen 2010-10-13参考网址一:/sshcx/archive/2007/05/01/1593923.aspx参考网址二:/share/detail/15909594WAVE 文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF"。
WAVE 文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF/WAV文件 标识段和声音数据格式说明段两部分。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。
采样率是指:声音信号在"模→数"转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
[!21ki@][@21ki!]对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。
WAVE文件是由样本组织而成的。
在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。
在多声道WAVE文件中,样本是交替出现的。
参考网址一和二中都给出了wav的头定义,但有一个小区别,一中将这个44个字节作为一个大的头,给定在一个结构体中,而二中则是按照四个不同的chunk处理的,所以就给了四个结构体,后面我的代码也是根据二来写的,个人觉得这样比较清晰,不过这纯属个人感觉。
下面就是根据四个结构体写的代码,注意FACT不是必须的,可以不用写入头,不写的话就是44个字节,写的话wave的头是56个字节。
一:源代码(参考二中也有比较详细的读wave头的代码)#if !defined(_WAV_INFO_)#define _WAV_INFO_// 一些和声音数据相关的宏#define SAMPLE_RATE 22050 // sample rate,每秒22050个采样点 #define QUANTIZATION 0x10 // 16bit量化,#define BYTES_EACH_SAMPLE 0x2 // QUANTIZATION / 8, 所以每个采样点、// 是short,占个2个字节#define CHANNEL_NUN 0x1 // 单声道#define FORMAT_TAG 0x1 // 线性PCM// 一个wave file包括四个CHUNK,除了FACT之外,其它是必须的,并且第一个RIFF是整个文件的头,// 所以别名为WAV_HEADER,而不是RIFF/*------------------------Wave File Structure ------------------------------------ */ typedef struct RIFF_CHUNK{char fccID[4]; // must be "RIFF"unsigned long dwSize; // all bytes of the wave file subtracting 8,// which is the size of fccID and dwSize char fccType[4]; // must be "WAVE"}WAVE_HEADER;// 12 bytestypedef struct FORMAT_CHUNK{char fccID[4]; // must be "fmt "unsigned long dwSize; // size of this struct, subtracting 8, which// is the sizeof fccID and dwSize unsigned short wFormatTag; // one of these: 1: linear,6: a law,7:u-law unsigned short wChannels; // channel numberunsigned long dwSamplesPerSec; // sampling rateunsigned long dwAvgBytesPerSec; // bytes number per secondunsigned short wBlockAlign; // 每样本的数据位数(按字节算), 其值为:通道// 数*每样本的数据位值/8,播放软件需要一次处// 理多个该值大小的字节数据, 以便将其值用于// 缓冲区的调整每样本占几个字节:// NumChannels * uiBitsPerSample/8unsigned short uiBitsPerSample; // quantization}FORMAT;// 24 bytes// The fact chunk is required for all new WAVE formats.// and is not required for the standard WAVE_FORMAT_PCM files// 也就是说,这个结构体目前不是必须的,一般当wav文件由某些软件转化而成,则包含该Chunk// 但如果这里写了,则必须是如下的结构,并且在四个结构体中的位置也要放在第三typedef struct {char fccID[4]; // must be "fact"unsigned long id; // must be 0x4unsigned long dwSize; // 暂时没发现有啥用}FACT;// 12 bytes// 数据结构typedef struct {char fccID[4]; // must be "data"unsigned long dwSize; // byte_number of PCM data in byte}DATA;// 8 bytes/*------------------------Wave File Structure ------------------------------------ */void WriteWaveHeader(FILE *fpwav,long length){WAVE_HEADER WaveHeader;FORMAT WaveFMT;DATA WaveData;FACT WaveFact;memset(&WaveHeader, 0, sizeof(WAVE_HEADER));memcpy(WaveHeader.fccID, "RIFF", 4);memcpy(WaveHeader.fccType, "WAVE", 4);// dwSize 是整个wave文件的大小(字节数,但不包括不包括HEADER中的前面两个结构:// HEADER.fccID和HEAD.dwSize)// WaveHeader.dwSize = length + 0x24; // 如果不写入fact,就是36个字节,// 44- 8 = 36个 WaveHeader.dwSize = length + 0x30; // 如果写入fact,就是48 个bytesmemset(&WaveFMT, 0, sizeof(FORMAT));memcpy(WaveFMT.fccID, "fmt ", 4);WaveFMT.dwSize = 0x10;WaveFMT.dwSamplesPerSec = SAMPLE_RATE;WaveFMT.dwAvgBytesPerSec = CHANNEL_NUN * SAMPLE_RATE * BYTES_EACH_SAMPLE;WaveFMT.wChannels = CHANNEL_NUN;WaveFMT.uiBitsPerSample = QUANTIZATION;WaveFMT.wFormatTag = FORMAT_TAG;WaveFMT.wBlockAlign = BYTES_EACH_SAMPLE;memset(&WaveFact, 0, sizeof(FACT));memcpy(WaveFact.fccID, "fact", 4);WaveFact.dwSize = length; // 这个值不知道什么意思WaveFact.id = 0x4;memset(&WaveData, 0, sizeof(DATA));memcpy(WaveData.fccID, "data", 4);WaveData.dwSize = length;fwrite(&WaveHeader, sizeof(WAVE_HEADER), 1, fpwav);fwrite(&WaveFMT, sizeof(FORMAT), 1, fpwav);fwrite(&WaveFact, sizeof(FACT), 1, fpwav); // fact不是必须的fwrite(&WaveData, sizeof(DATA), 1, fpwav);}void WriteWavfile(FILE *fp, short *pSpeechData, int length){//write the header of wavWriteWaveHeader(fp, length * BYTES_EACH_SAMPLE);//write the datafwrite(pSpeechData, sizeof(short), length, fp);}#endif二:数据存储结构:根据声音文件的声道和量化数的不同,在头之后的数据存储有不同的格式,如下面:/share/detail/15909594---------------------------------------------------------------------| 单声道| 取样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(右) || | (低位字节) | (高位字节) | (低位字节) | (高位字节) |---------------------------------------------------------------------图:Wav的data数据的bit位置可能的几种形式三:各种头示例常用语音编码的WAVE文件头格式剖析--各种编码/content/10/0812/10/722458_45443101.shtml表18KHz采样、16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 10 00 00 00H(PCM) long int size1=0x1014H 2 int 01 00H int fmttag=0x0116H 2 int int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=声道数*量化数/822H 2 int 量化数int bitpersamples=8或1624H 4 char "data" char data_id="data"28H 4 long int 采样数据字节数long int size2=文长-442CH 到文尾char 采样数据表28KHz采样、8比特A律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(ALAW) long int size1=0x1214H 2 int 06 00H int fmttag=0x0616H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=0x0122H 4 long int 量化数long int bitpersamples=826H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000000530700H定char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数lont int size2=文长-58表38KHz采样、8比特U律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(ULAW) long int size1=0x1214H 2 int 07 00H int fmttag=0x0716H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=0x0122H 4 long int 量化数long int bitpersamples=826H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000000530700H定char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数lont int size2=文长-58表4ADPCM语音编码后的WAVE文件头格式表(共90字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 32000000H(ADPCM) long int size1=0x3214H 2 int 02 00H int fmttag=0x0216H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=声道数*量化数/822H 2 int 量化数int bitpersamples=424H 34 char 固定字节char temp146H 4 char "fact" char wave_fact="fact"4AH 8 char 0400000004930600H定char temp252H 4 char "data" char wave_data="data"56H 4 long int 采样数据字节数lont int size2=文长-905AH 到文尾采样数据表5GSM语音编码后的WAVE文件头格式表(共60字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 14000000H(GSM) long int size1=0x1414H 2 int 31 00H int fmttag=0x3116H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 8 char 4100000002004001H定char temp128H 8 char 6661637404000000H定char temp230H 4 char 40 E2 05 00H定char temp334H 4 char "data" char wave_data="data"38H 4 long int 采样数据字节数lont int size2=文长-603CH 到文尾采样数据表6SBC语音编码后的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(SBC) long int size1=0x1214H 2 int 71 00H int fmttag=0x7116H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=0x2522H 4 long int 量化数long int bitpersamples=1626H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000076280400H定char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数lont int size2=文长-59表7CELP语音编码后的WAVE文件头格式表(共58字节)偏移地址字节数数据类型内容文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(CELP) long int size1=0x1214H 2 int 70 00H int fmttag=0x7016H 2 int 声道数int channel=1 或218H 4 long int 采样率long int samplespersec1CH 4 long int 每秒播放字节数long int bytepersec20H 2 int 采样一次占字节数int blockalign=0x0C22H 4 long int 量化数long int bitpersamples=1626H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000060520700H定char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数lont int size2=文长-58WAVEFORMATEXtypedef struct{WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX;具体参数解释如下:wFormatTag:波形数据的格式,定义在MMREG.H文件中nChannels:波形数据的通道数:单声道或立体声nSamplesPerSec:采样率,对于PCM格式的波形数据,采样率有8.0 kHz,11.025kHz,22.05 kHz,44.1 kHz等nAvgBytesPerSec:数据率,对于PCM格式的波形数据,数据率等于采样率乘以每样点字节数nBlockAlign:每个样点字节数wBitsPerSample:采样精度,对于PCM格式的波形数据,采样精度为8或16cbSize:附加格式信息的数据块大小概念2、定义设备头结构WAVEHDR定义了指向波形数据缓冲区的设备头。