wave波形文件格式,wave文件格式是视频文件

wave波形文件格式,wave文件格式是视频文件,详解RIFF和WAVE音频文件格式

主要介绍了RIFF文件和WAV音频文件的格式,为读写WAV文件奠定了理论基础。我打算用C标准库读写WAV文件。

RIFF file format

RIFF称为资源交换文件格式,是Windows下大多数多媒体文件遵循的文件结构。RIFF文件中包含的数据类型由文件的扩展名来标识。可以以RIFF格式存储的数据有:

音频隔行格式数据。AVI波形格式数据。位图数据格式。RDIMIDI格式数据。RMI调色板格式。PAL多媒体电影。RMN动画光标。和其他RIFF文件。BND

CHUNK

组块是RIFF文件的基本单位,其基本结构如下:

结构块

{

uint32 _ t id//阻止标志

uint32_t大小;//块大小

uint8_t数据[大小];//块数据

};

4个字节的ID,用于标识块中包含的数据。如:RIFF,LIST,fmt,data,WAV,AVI等。因为这种文件结构最初是由微软和IBM为PC定义的,所以RIFF文件是按小端字节顺序编写的。块的大小是存储在数据字段中的数据的长度。没有id和size的数据的大小包含数据,数据是以文字存储的。如果数据长度是奇数(以字节为单位),最后添加一个空字节。

块可以嵌套,但是只有块被标记为RIFF或LIST的块可以包含其他块。

RIFF chunk

标记为RIFF的块是特殊的。每个RIFF文件必须首先存储一个RIFF块,并且只有这个文件被标记为RIFF。RIFF的数据字段的起始位置是一个4字节的代码(FOURCC),用来标识其数据字段中chunk的数据类型;那么数据字段的内容就是包含的子块,如下图所示。

在这个片段块中有两个子运行。可以看出,RIFF chunk的数据字段首先是一个4字节的表单类型,后面是两个子块。每个子块都有自己的标识、数据字段大小和数据字段。

除了RIFF块可以嵌套其他块,另一个可以拥有子块的是LIST块。

上图中,第一个是RIFF文件必需的RIFF chunk,它的数据字段包含两个子块,其中一个是LIST类型,LIST chunk包含两个子块。

FourCC

FourCC称为四字符码,是一个4字节32位标识符,通常用于标识文件的数据格式。例如,在音频和视频播放器中,文件的FourCC可用于决定调用哪个编解码器来解码音频和视频。例如:DIV3、DIV4、DIVX、H264等。音频方面,有:WAV,MP3等。对于以上的RIFF文件,有:RIFF、WAVE、fmt、data等。FourCC是4个ASCII字符,空格(非空字符)添加在少于4个字符的字符的末尾。例如,FourCC fmt实际上是' f' 'm''t ' '。

FourCC的生成通常可以使用以下宏:

#定义MAKE_FOURCC(a,b,c,d) \

(((uint 32 _ t)d)|(((uint 32 _ t)c)8)|(((uint 32 _ t)b)16)|(((uint 32 _ t)a)24))

最好不要在程序中使用太长的宏。在C #中,可以使用模板和枚举的组合。以确保FourCC可以在编译时生成。

#定义FOURCC uint32_t

模板char ch0,char ch1,char ch2,char CH3 struct MakeFOURCC { enum { value=(ch0 0)(ch1 8)(CH2 16)(CH3 24)};};

FOURCC fourcc_fmt=MakeFOURCC'f ',' m ',' t ',' ' ' ':value

将字符常量传入模板,在结构中声明一个枚举,编译器会在编译时确定枚举值,从而保证编译时可以生成FOURCC。

WAV file

WAV是微软开发的一种音频文件格式,符合上述RIFF文件格式标准,可以看作是RIFF文件的一个具体例子。由于WAV符合RIFF规范,所以它的基本组件也是chunk。一个WAV文件通常有三个块和一个可选块,按照RIFF块、格式块、事实块(附加块,可选)和数据块的顺序排列。

一个WAV文件,首先是一个RIFF块;Rifchunk还包括格式块、数据块和可选的事实块。每个块中字段的含义如下:

rifchunkid fourcc的值是' R' 'I' 'F' 'F'size,它的数据字段中的数据的大小,字节数,数据包含其他的chunkFormat chunkidFOURCC的值是' f'' m'' t'' size,而数据字段包含数据的大小。如果没有扩展块,则值为16;如果有扩展块,则值=16 2字节扩展块长度或值为18(只有扩展块的长度为2字节,值为0)数据。

存储音频格式、通道数量、采样率和其他信息。

格式_标签

2字节,代表音频数据的格式。值1表示使用PCM格式。

频道

2字节,通道数。值1是单声道的,值2是双耳的。

每秒采样数

采样率主要有22.05KHz、44.1kHz和48KHz。

每秒字节数

音频的比特率,每秒播放的字节数。samples _ per _ sec * channels * bits _ per _ sample/8,您可以估计所用缓冲区的大小。

块_对齐

块对齐单位,一个样本的大小,其值为通道数*量化位数/8。播放时,需要一次处理该值的多个字节数据。

每样本位数

音频样本的量化比特包括16比特、24比特和32比特。

cbSize

延伸区域的长度

扩展块内容

2个字节,具体介绍,稍后补充。

事实块(选项)idFOURCC值是' f' 'a' 'c' 't '大小数据字段的长度,4(最小值是4)样本总数是4字节数据块id。

FOURCC的值是' d' 'a' 't' 'a '

大小

数据字段的长度

数据

特定的音频数据存储在这里。

压缩编码的WAV文件必须有Fact chunk,其中只有一个数据,就是每个通道的样本总数。

Format chunk 中的编码方式

在Format chunk中,除了音频数据的采样率、声道等音频属性外,另一个重要的字段是format_tag,表示音频数据是如何编码和存储的。具体值可以如下:

0x0001

WAVE_FORMAT_PCM,PCM格式

0x0003

WAVE_FORMAT_IEEE_FLOAT,存储值为IEEE float,取值范围为[-1.0f,1.0f]

0x0006

波_格式_ALAW,8bit ITU-T G.711 A-law

0x0007

WAVE_FORMAT_MULAW,8bit ITU-T G.711 -law

0XFFFE

WAVE_FORMAT_EXTENSIBLE,具体编码方式由扩展区的sub_format字段决定。

关于扩展格式块

当WAV文件不使用脉码调制方式时,需要扩展格式块,这就在基本格式块中增加了另一条数据。该数据的前两个字节表示扩展块的长度。随后是包含扩展格式信息的扩展数据区,其具体长度取决于压缩编码的类型。当一种编码方法(如ITU G.711 a-law)使扩展区的长度为0时,扩展区的长度字段必须保留,但其值设置为0。

扩展区每个字节的含义如下:

2字节大小

扩展名的数据长度可以是0或22。

有效位每样本2字节

有效采样位数,最大值是采样字节数* 8。可以使用更灵活的量化位。通常,音频样本的量化比特是8的倍数,但是当使用WAVE_FORMAT_EXTENSIBLE时,量化比特由扩展区域中的每个样本的有效比特来描述,其可以小于格式组块中公式化的每个样本的比特。

Chanemask 4字节

频道屏蔽

子格式16字节

GUID,包括数据格式代码,数据格式代码。

当格式块中的format_tag设置为0xFFFE时,表示扩展区中的sub_format用于确定音频数据的编码方式。在下列情况下,必须使用WAVE_FORMAT_EXTENSIBLE

PCM数据的量化位大于16。音频的采样通道大于2。实际的量化位不是8的倍数。存储顺序和播放顺序不一致。有必要指定从通道顺序到声卡播放顺序的映射。

Data chunk

数据块存储音频的采样数据。每个样本都是按照采样的时间顺序编写的。对于使用多个字节的样本,它以小端模式存储(低位字节存储在低位地址,高位字节存储在高位地址)。对于多通道采样,采用交叉存储。例如,立体声双耳样本的存储顺序是:声道1的第一个样本和声道2的第一个样本;通道1的第二个样本,通道2的第二个样本;诸如此类。对于PCM数据,有以下两种存储方法:

单声道,量化位数为8,使用偏移二进制码,除了以上,都是以补码的方式存储。

总结

主要介绍了RIFF文件和WAV音频文件的格式,为读写WAV文件奠定了理论基础。我打算用C标准库读写WAV文件。

这就是这篇关于RIFF和WAVE音频文件格式的文章。有关RIFF和WAVE音频格式的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: