主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。