RIFF格式简介

Resource Interchange File Format(简称RIFF),资源交换文件格式,是一种按照标记区块存储数据(tagged chunks)的通用文件存储格式,多用于存储音频、视频等多媒体数据。Microsoft在windows下的AVI、ANI 、WAV等都是基于RIFF实现的。

RIFF是由Microsoft和IBM于1991年,在windows 3.1中引入的,作为windows 3.1默认的多媒体文件格式。RIFF是参考Interchange File Format来的,二者主要的区别是字节序大端、小端的问题。在基于IBM的80x86系列主机下,RIFF的字节序是小端的;而在IFF原有的格式中是按照大端存储整型数据的。

RIFF文件 

RIFF文件的基本构成单元是chunk。通常情况下一个chunk是指多媒体数据的一个基本逻辑单元,比如视频的一帧数据、音频的一帧数据等等。每个chunk包含以下三个字段:

  • FOURCC(四字节码),用于标识chunk ID或chunk 类型。
  • 四字节整数,表示chunk中的数据域长度(Size)。
  • 数据域(data Field)。

chunk是可以嵌套的。下图说明了用于两个subchunk的“RIFF”文件结构。

RIFF chunk that contains two subchunks image

 包含在一个chunk中的chunk被称为subchunk。只有ID为“RIFF”或者“LIST”的chunk允许拥有subchunk。RIFF文件的第一个chunk的id必须是“RIFF”四字节码,也就是说id为“LIST”的chunk只能是subchunk。

“RIFF”chunk的数据域的起始位置是一个四字节码(称为Form Type,类型码),用于说明数据域的格式,比如“WAV”、“AVI”等。

“LIST”chunk的数据域的其实位置也有一个四字节码(称为List Type,类型码),用于说明LIST数据域的数据内容。比如,“LIST”chunk的list type为“INFO”时,其数据域可能包括“ICOP”、“ICRD”chunk,用于记录文件版权和创建时间信息。

下图是“RIFF”chunk中拥有两个subchunk,其中一个subchunk “LIST”又嵌套的包含两个subchunk。

RIFF chunk that contains a LIST chunk image

 RIFF读写处理

 RIFF文件中多次提到四字节码,Windows中提供了用于标识四字节码FOURCC,对于不足四个的ASCII码,在右侧补空格字符即可。比如多媒体输出输出函数中的mmioFOURCC,定义如下:

FOURCC mmioFOURCC(
  CHAR ch0,
  CHAR ch1,
  CHAR ch2,
  CHAR ch3
);

#define MAKEFOURCC(ch0, ch1, ch2, ch3)  \ 
    ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |  \ 
    ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ));

也可使用mmioStringToFOURCC函数将字符串转化为四字节码。

如果不关心RIFF文件负载内容,可按照普通文件读写RIFF文件。

可使用mmioCreateChunk函数、mmioAscend函数、mmioDescend函数等读写RIFF文件、移动文件指针等。详细使用建议参考MSDN上相关内容。(Multimedia File I/O Services)

 

参考文献:

Wiki:http://en.wikipedia.org/wiki/Resource_Interchange_File_Format

MSDN:http://msdn.microsoft.com/en-us/library/dd798636(v=vs.85).aspx

你可能感兴趣的:(RIFF格式简介)