RIFF文件格式

1. 简介

RIFF全称为资源互换文件格式ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:

  • 音频视频交错格式数据(.AVI)

  • 波形格式数据(.WAV)

  • 位图格式数据(.RDI)

  • MIDI格式数据(.RMI)

  • 调色板格式(.PAL)

  • 多媒体电影(.RMN)

  • 动画光标(.ANI)

  • 其它RIFF文件(.BND)

2. CHUNK

  chunk是组成RIFF文件的基本单元,它的结构如下:

structchunk

{

  u32id; /* 块标志 */

  u32size; /* 块大小 */

  u8dat[size]; /* 块内容 */

};

  • id4ASCII字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt','data','WAV','AVI'等等,由于这种文件结构最初是由MicrosoftIBMPC机所定义,RIFF文件是按照little-endian字节顺序写入的。

 

  • size(块大小)是存储在data域中数据的长度,idsize域的大小则不包括在该值内。

 

  • dat(块内容)中所包含的数据是以字(WORD)为单位排列的,如果该数据结构长度是奇数,则在最后添加一个空(NULL)字节。

其中有仅有两种块:'RIFF''LIST'块可以包含其他块,而其它块仅能含有数据。

structchunk

{

  u32id; /* 块标志 */

  u32size; /* 块大小 */

  /*此时的dat = type + restdat */

u32type ; /* 类型 */

u8restdat[size] /* dat中除type4个字节后剩余的数据*/

};

可以看出,'RIFF''LIST'也是chunk,只是它的dat由两部分组成:

  • type,由4ASCII字符组成,代表RIFF文件的类型,如'WAV','AVI ';或者'LIST'块的类型,如avi文件中的列表'hdrl','movi'

  • restdatdat中除type4个字节后剩余的数据,包括块内容,包含若干chunk'LIST'

2.1 FOURCC

一个FOURCC(fourcharacter code)是一个占4个字节的数据,一般表示4ASCII字符。在RIFF文件格式中,FOURCC非常普遍,structchunk 中的id成员,'LIST','RIFF'type成员,起始标识等信息都是用FOURCC表示的。FOURCC一般是四个字符,如'abcd'这样的形式,也可以三个字符包含一个空格,如'abc'这样的形式。

2.2 RIFF文件块

RIFF文件块的数据结构如下:

'RIFF' FileSize FileType FileData

  • 'RIFF' 是一个FOURCC,用于标识该文件是一个RIFF格式的文件。

  • FileSize 是一个4字节的数据,给出文件的大小,但仅包括FileTypeFileData两部分。

  • FileType是一个FOURCC,用来说明文件类型,如"WAV","AVI"等。

  • FileData部分表示文件的具体内容,可以是LIST也可以是CHUNK.

2.3 LIST

一个LIST数据块的数据结构如下:

'LIST' ListSize ListType ListData

  • 'LIST'是一个FOURCC,而且是固定的每个LIST都是以'LIST'为开头

  • ListSize占用4个字节,表示ListTypeListData两部分加在一起的大小。

  • ListType是一个FOURCC,是对LIST具体包含的数据内容的标识。

  • ListData是该LIST的数据内容区,由CHUNK和子LIST组成,它们的个数和组成次序可以是不确定的。

3. 举例

4. 总结

  1. RIFF文件的FileData部分由若干个'LIST'chunk组成,而'LIST'ListData又可以由若干个chunk'LIST'组成,且'LIST'是可以嵌套的。

  2. 'RIFF',FileType,'LIST',ListType,ChunkID都是FOURCC,即使用4字节的ASIIC字符标识类型。

  3. FileSizeListSizeChunkSizelittle-endian32-bit正整数,表示Type(只有'RIFF','LIST'chunkType)+Data一起的大小,注意它是little-endian表示,如:0x00123456,存储地址由低到高,在little-endian系统中的存储表示为0x56341200(字节由低位到高位存储),而在big-endian0x00123456(字节由高位到低位存储)。

 

32bit整数

0x00123456

 

存储地址低--------->

little-endian(字节由低位到高位存储)

56

34

12

00

big-endian(字节由高位到低位存储)

00

12

34

56

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值