标签 RIFF 下的文章
 2020-03-29T18:03:53.702000    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     1387 views
1、WAV文件概述WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format,RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!WAV通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。2、WAV文件格式WAV符合RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。示意图如下:一个WAV文件,首先是一个RIFF chunk,其格式类型为'WAVE'。RIFF chunk包括两个子chunk,ID分别为 'fmt '和'data',还有一个可选的Fact chunk。Format chunk用于表示音频数据的属性,包括编码方式、声道数目、采样频率、每个采样需要的bit数等等信息。Fact chunk是一个可选chunk,一般当WAVE文件由某些软件转化而成就包含Fact chunk。Data chunk包含WAVE文件的数字化波形声音数据。 WAVE整体结构如下图所示:接下来讲讲各个chunk的具体内容。3、各个chunk的具体内容(1).RIFF chunkID:4字节,值为"RIFF"。Size:4字节,ChunkData字段中数据的大小,单位:字节。ChunkData:包含FormType和其他chunk的内容。      FormType:4字节,值为"WAVE"。      Data:其他chunk的内容。(2).Format chunkID:4字节,值为"fmt ",最后一个字符是空格。Size:4字节,数据字段(Data)包含的数据大小。如无扩展块,则值为16;有扩展块,则值为= 16 + 2字节扩展块长度 + 扩展块内容,或者值为18(只有扩展块长度为2字节,并且扩展块长度值为0),单位:字节。Data:存放音频格式、声道数、采样率等信息。      audio_format:2字节,表示音频数据的格式。如值为1,表示使用PCM格式。      channels:2字节,声道数。值为1则为单声道,为2则是双声道。      sample_rate:4字节,采样频率,主要有22.05KHz,44.1kHz和48KHz等,例如0xAC44表示44100Hz。      bytes_per_sec:4字节,音频的码率,每秒播放的字节数。其值为:声道数 * 采样频率 * 量化位数 / 8,可以估算出使用缓冲区的大小。      block_align:2字节,每个采样点所需的字节数,其值为:声道数 * 量化位数 / 8。      bits_per_sample:2字节,量化位数,有16位,24位和32位等。      cbSize:2字节,扩展块的长度,其值可以为0或者22。      cbContent:0字节或22字节,扩展块内容,具体介绍在下文提及。备注:这个区域只需要关心channels,sample_rate,bits_per_sample三个参数就可以了,其它的都是依据这三个计算出来的。(3).Fact chunk(可选)fact chunk为可选的,在大多数的WAV文件中是不存在的。采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。ID:4字节,值为"fact"。Size:4字节,数据字段的长度,其值最小为4。Data:采样总数。(4).Data chunkID:4字节,值为"data"。Size:4字节,音频数据的长度。Data:具体的音频数据内容存放在这里。4、Format chunk中的音频数据格式在format chunk中,有一个字段audio_format,该字段表示音频数据是以何种方式进行编码存放的。其可选的取值有:0x0001:WAVE_FORMAT_PCM,采用PCM格式,此时WAV文件中不包含Fact chunk。0x0002:WAVE_FORMAT_ADPCM,此时WAV文件中包含Fact chunk。0x0006:WAVE_FORMAT_ALAW,此时WAV文件中包含Fact chunk。0x0007:WAVE_FORMAT_MULAW,此时WAV文件中包含Fact chunk。0xFFFE:WAVE_FORMAT_EXTENSIBLE,具体的编码方式由Format chunk中扩展块的sub_format字段决定。备注:一般情况下,我们遇到的WAV文件的音频数据编码格式是PCM,介绍上述内容,只是让大家多了解下其他的编码格式的值与名称,当遇到这类编码时,能够知道其名称,从而方便查询相关资料。5、Format chunk中的扩展块当WAV文件使用的不是PCM编码方式时,就需要扩展格式块,它是在基本的Format chunk中又添加一段数据。该数据的前两个字节,表示的是扩展块的长度。紧接其后的是扩展块的数据区,含有扩展的格式信息,其具体的长度取决于压缩编码的类型。当某种编码方式的扩展块的数据区长度为0,此时扩展块只包含了扩展块长度字段,扩展块的长度字段还必须保留,只是其值设置为0。扩展块的各个字节的含义如下:cbSize:2字节,扩展块的长度,其值可以为0或者22。cbContent:0字节或22字节,扩展块内容。      valid_bits_per_sample:2字节,有效的采样位数,最大值为block_align * 8。可以使用更灵活的量化位数,通常音频sample的量化位数为8的倍数,但是使用了WAVE_FORMAT_EXTENSIBLE时,量化的位数由扩展块中的valid_bits_per_sample来描述,可以小于Format chunk中指定的bits_per_sample。      channle_mask:4字节,声道掩码。      sub_format:16字节,数据格式码。在Format chunk中的audio_format设置为0xFFFE时,表示使用扩展区中的sub_format来决定音频的数据的编码方式。在以下几种情况下必须要使用WAVE_FORMAT_EXTENSIBLE:PCM数据的量化位数大于16。音频的采样声道大于2。实际的量化位数不是8的倍数。存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序的映射情况。备注:一般情况下,我们遇到的WAV文件中是不含有扩展块的。6、声音数据格式Data chunk中的Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推....。对于Data chunk中的Data字段,也就是音频数据内容的存储,根据声道数和采样位数的不同情况,布局如下(每1列代表8 bits):1.8 bit 单声道采样1采样2数据1数据22.8 bit 双声道采样1采样2声道1数据1声道2数据1声道1数据2声道2数据23.16bit 单声道采样1采样2数据1低字节数据1高字节数据2低字节数据2高字节4.16bit 双声道声道1采样1声道2采样1声道1数据1低字节声道1数据1高字节声道2数据1低字节声道2数据1高字节声道1采样2声道2采样2声道1数据2低字节声道1数据2高字节声道2数据2低字节声道2数据2高字节7、WAV文件实例分析利用winhex工具软件可以非常方便的以十六进制查看文件,下图是我用winhex软件打开一个WAV音频文件时的部分界面截图:下表对文件格式进行解读:偏移地址字节数16进制源码内容00H452 49 46 46'RIFF'标识符04H4F4 FE 83 01数据长度:0x0183FEF4(注意顺序)08H457 41 56 45'WAVE'标识符0CH466 6D 74 20'fmt ',最后一位为空格10H410 00 00 00Format chunk大小:0x1014H201 00编码格式:0x01为PCM16H202 00声道数目:0x02为双声道18H444 AC 00 00采样频率:0xAC44表示44100Hz1CH410 B1 02 00每秒字节数:0x02B11020H204 00每个采样点所需的字节数:0x0422H210 00量化位数:0x1024H464 61 74 61'data'标识符28H448 FE 83 01音频数据的长度:0x0183FE48从偏2CH开始就是音频数据了。如果觉得文章写的不错,对你有帮助,欢迎点赞,关注博主哟!
嵌入式WAVRIFF 阅读全文»
 2020-01-31T16:29:31.902000    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     1743 views
1、简介RIFF(Resources Interchange File Format)中文翻译为资源互换文件格式,是Windows下大部分多媒体文件遵循的一种文件结构。RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF格式存储的数据有:• 音频视频交错格式数据 .AVI• 波形格式数据 .WAV• 位图数据格式 .RDI• MIDI格式数据 .RMI• 调色板格式 .PAL• 多媒体电影 .RMN• 动画光标 .ANI• 其他的RIFF文件 .BND2、chunkchunk(区块)是RIFF文件的基本单元,RIFF文件由不同数量的chunk组成,每个chunk由“标识符”、“数据大小”和“数据”三个部分组成,“标识符”和“数据大小”都是占用 4 个字节空间,chunk的基本结构如下所示:struct chunk{    uint32_t  ID; //块标识符    uint32_t  Size; //块数据大小    uint8_t   Data[Size]; //块数据};ID:由4个ASCII字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt ','data','WAV ','AVI '等,这种文件结构最初是由Microsoft和IBM为PC机所定义,所以RIFF文件是按照小端字节顺序写入的。Size:块数据大小,存储在Data域中的数据长度,不包含ID和Size的大小。Data:块数据,数据以字为单位存放,如果数据长度为奇数(字节为单位),则最后添加一个空字节。chunk是可以嵌套的,但是只有块标识符为'RIFF'或者'LIST'的chunk才能包含其他的chunk。3、FourCCFourCC(Four Character Codes)是一个4字节32位的标识符,通常用来标识文件的数据格式。例如,在音视频播放器中,可以通过文件的FourCC来决定调用哪种CODEC进行音视频的解码。例如:DIV3,DIV4,DIVX,H264等,对于音频则有:WAV,MP3等。FourCC是4个ASCII字符,不足四个字符的则在最后补充空格(不是空字符)。比如,FourCC fmt,实际上是'f' 'm' 't' ' '。4、RIFF chunk和LIST chunk块标识符ID为'RIFF'的chunk是比较特殊的,每一个RIFF文件首先存放的必须是一个RIFF chunk,并且只能有一个标识符为'RIFF'的chunk。RIFF chunk的数据域的起始位置是一个4字节的FormType(FourCC格式),用于标识RIFF chunk数据域中所包含的chunk的数据类型。紧接着FormType之后的数据域的内容则是RIFF chunk所包含的subchunk。一个简单的RIFF chunk的示意图如下所示:上图中的RIFF chunk包含有两个subchunk,可以看出RIFF chunk的数据域首先是4字节的FormType,接着是两个subchunk,每一个subchunk又包含有自己的标识符、数据域的大小以及数据域。除了RIFF chunk可以嵌套其他的chunk外,另一个可以包含subchunk的就是LIST chunk,其示意图如下所示:上图中,首先是RIFF文件必须的RIFF chunk,其数据域又包含有两个subchunk,其中一个subchunk的类型为'LIST',该LIST chunk又包含了两个subchunk。RIFF chunk和LIST chunk的基本结构如下所示:struct chunk{    uint32_t ID; //块标识符: 'RIFF'或者'LIST'    uint32_t Size; //块数据大小    struct ChunkData { //块数据        uint32_t  Type; //包含的subchunk的数据类型, 与上面图中的FormType和ListType对应        uint8_t   Data[Size-4]; //包含的subchunk    };};备注:一个RIFF文件的总大小为:RIFF chunk的Size+8,这里的8是ID和Size所占用的空间。如果觉得文章写的不错,对你有帮助,欢迎点赞,关注博主哟!
嵌入式RIFFWAV 阅读全文»
  • 1

  本站信息

目前本站共被浏览 162784 次
目前本站已经运行 3508 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号