Resource Interchange File Format(简称RIFF),资源交换文件格式,是一种按照标记区块存储数据(tagged chunks)的通用文件存储格式,多用于存储音频、视频等多媒体数据。Microsoft在windows下的AVIANI 、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”文件结构。

包含在一个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读写处理

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) << ) | \
((DWORD)(BYTE)(ch2) << ) | ((DWORD)(BYTE)(ch3) << ));

也可使用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格式简介的更多相关文章

  1. vcf格式简介

    1)背景 伴随着大规模的基因分型及测序工程的产生(例如1000 Genomes Project),之前的信息贮存格式例如gff文件它记录了每一个基因的详细信息,其中许多基因信息在基因组之间是共享的,而 ...

  2. JSON数据表示格式简介(JavaScript对象表示法)

    [1] JSON简介    > JSON全称 JavaScript Object Notation    > 类似于JS中对象的创建的方法    > JSON和XML一样,都是一种表 ...

  3. IFC格式简介

    IFC是一个数据交换标准, 用于不同系统交换和共享数据.当需要多个软件协同完成任务时, 不同系统之间就会出现数据交换和共享的需求.这时, 工程人员都希望能将工作成果(这里就是工程数据), 从一个软件完 ...

  4. JSON格式简介

    一.JSON:JavaScript Object Notation的简写,是一种轻量级数据交换格式. 二.数据类型:标量.序列(数组).映射(key-value) 三.JSON的四个原则 1 .并列数 ...

  5. LibSVM格式简介

    对于训练或预测,XGBoost采用如下格式的实例文件: train.txt 1 101:1.2 102:0.03 0 1:2.1 10001:300 10002:400 0 0:1.3 1:0.3 1 ...

  6. HTTP 报文格式简介

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送 WWW 方式的数据,关于 HTTP 协议的详细内容请参考 RFC2616.HTTP 协议采用了请求/响 ...

  7. 编码的来源于格式简介ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE

    编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚.但是编码又是那么重要,特别在网页这一块.如果你打出来 ...

  8. 多媒体文件格式之AVI

    [时间:2016-07] [状态:Open] AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件 ...

  9. WAVE文件格式解析

    WAVE 文件作为Windows多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.这里不针对RIFF文件格式做介绍,不 ...

随机推荐

  1. [转]GFS架构分析

    Google文件系统(Google File System,GFS)是构建在廉价的服务器之上的大型分布式系统.它将服务器故障视为正常现象,通过软件的方式自动容错,在保证系统可靠性和可用性的同时,大大减 ...

  2. Xcode使用小技巧-filter查找功能和查看最近修改的文件

    今天偶然发现了关于Xcode的一个小技巧: 1.查看最近修改的文件 2.使用filter查找制定文件 没错,就是下面这个东西,很容易忽略的一个小工具,在Xcode左下角位置. 通过这个,我们能够在整个 ...

  3. IDEA导入项目jar包红线, cannot resolve symbol xxxx问题

    简单来说遇到的这种情况2种方式解决了, 不知道还有没有其他原因的. 1.reimport包 2.清缓存重启 针对1方法: a.确实不缺包: 可以先注释掉pom文件中的jar包, 此时idea会提示im ...

  4. Ubuntu中root用户和user用户的相互切换[转载自93度的饼干]

    Ubuntu中root用户和user用户的相互切换 Ubuntu是最近很流行的一款Linux系统,因为Ubuntu默认是不启动root用户,现在介绍如何进入root的方法. (1)从user用户切换到 ...

  5. Kickstart无人值守安装[转载]

    导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有什么? 光盘安装系统===>一个服务器DV ...

  6. 【Android】Android如何实现手机震动

    实现手机震动其实很简单,手机震动使用是Vibrator类,然后震动也是需要权限的,在使用之前在AndroidManifest.xml文件中添加 <uses-permission android: ...

  7. 【Oracle】Oracle中dump函数的用法

    一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全没有参数时,直接返回null.另外 ...

  8. java单双派机制理解

    引言:Java是一个支持双分派的单分派语言 知道java是支持后期动态绑定,也知道访问者模式,但是两者之间的关系,还真不知道,况且在这之间还有一个静态绑定. 1.动态绑定 class Father { ...

  9. golang学习 ----获取URL

    package main import ( "fmt" "io/ioutil" "net/http" "os" ) fu ...

  10. mysql-binlog_cache_size

    二进制日志缓冲区吗,默认是32k.该参数是基于会话的,不要设置过大. 当事务的记录大于设定的binlog_cache_size时,mysql会把缓冲区中的日志信息写入一个临时文件中,所以该值也不能设置 ...