RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构。

RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF格式存储的数据有:

  • 音频视频交错格式数据(.AVI)
  • 波形格式数据(.WAV)
  • 位图格式数据(.RDI)
  • MIDI格式数据(.RMI)
  • 调色板格式(.PAL)
  • 多媒体电影(.RMN)
  • 动画光标(.ANI)
  • 其它RIFF文件(.BND)

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

Chunk ID 4 bytes
Chunk Size 4 bytes
Data  
  • Chunk ID: 用以标识块中所包含的数据。如:RIFF,LIST,fmt,data,WAV,AVI等,由于这种文件结构最初是由 Microsoft 和 IBM 为PC机所定义,RIFF文件是按照小端 little-endian 字节顺序写入的。
  • Chunk Size: 存储在data域中的数据长度,不包含 Chunk ID 和 Chunk Size 本身的大小。
  • Data: 包含数据,数据以字节为单位存放,如果数据长度为奇数(字节为单位),则最后添加一个空字节。

chunk是可以嵌套的,但是只有Chunk ID为RIFF或者LIST的chunk才能包含其他的chunk。

针对这两种chunk,RIFF又从原先的"data"中切出4个Byte。 这4个Byte称为"格式辨别码",而RIFF又规定文件中仅能有一个以"RIFF"为辨别码的chunk。

RIFF chunk

标志为RIFF的chunk是比较特殊的,每一个RIFF文件首先存放的必须是一个RIFF chunk,并且只能有这一个标志为RIFF的chunk。

RIFF的数据域的起始位置是一个4字节码(FOURCC),用于标识其数据域中chunk的数据类型;

紧接着数据域的内容则是包含的subchunk,

如下图:

上图是一个RIFF chunk中包含有两个subchunk,RIFF chunk的数据域首先是4字节的 Form Type,接着是两个subchunk,每一个subchun有包含有自己的标识、数据域的大小以及数据域。

LIST chunk

如图:

上图中,首先是RIFF文件必须的RIFF chunk,其数据域又包含有两个subchunk,其中一个subchunk的类型为LIST,该LIST chunk又包含了两个subchunk。

FourCC

FourCC 全称为Four-Character Codes,是一个4字节32位的标识符,通常用来标识文件的数据格式。

例如,在音视频播放器中,可以通过 文件的FourCC来决定调用那种CODEC进行视音频的解码。

例如:DIV3,DIV4,DIVX,H264等,对于音频则有:WAV,MP3等。对于上面的RIFF文件,则有:RIFF,WAVE,fmt,data等。

FourCC是4个ASCII字符,不足四个字符的则在最后补充空格(不是空字符)。比如,FourCC fmt,实际上是'f' 'm' 't' ' '。

FourCC的生成通常可以使用如下宏:

#define MAKE_FOURCC(a,b,c,d) \
( ((uint32_t)d) | ( ((uint32_t)c) << ) | ( ((uint32_t)b) << ) | ( ((uint32_t)a) << ) )

在程序 中还是不要使用太长的宏为好,在C++中可以使用模板和enum结合的方式。来保证在编译时期就能够将FourCC生成出来。

#define FOURCC uint32_t
template <char ch0, char ch1, char ch2, char ch3> struct MakeFOURCC{ enum { value = (ch0 << ) + (ch1 << ) + (ch2 << ) + (ch3 << ) }; };
FOURCC fourcc_fmt = MakeFOURCC<'f', 'm', 't', ' '>::value;

将字符常量传入模板,在结构体中声明一个enum,编译器会在编译时期确定枚举值,这样就能给保证FOURCC在编译就能生成出来。

RIFF的更多相关文章

  1. RIFF和WAVE音频文件格式

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...

  2. 利用WinHEX,重构狂牛加密视频1.0.0.1【只适合RIFF(AVI)】

    幸亏是视频部分没有进行加密 1.用 WinHEX 打开狂牛加密视频, 查找 [RIFF] 字符串 2.光标放在 RIFF的 [R]上面, 按 CTRL+SHIFT+END 3.把选择的块写入新文件 H ...

  3. RIFF格式简介

    Resource Interchange File Format(简称RIFF),资源交换文件格式,是一种按照标记区块存储数据(tagged chunks)的通用文件存储格式,多用于存储音频.视频等多 ...

  4. Digital Audio - Creating a WAV (RIFF) file

    Abstract:This tutorial covers the creation of a WAV (RIFF) audio file. It covers bit size, sample ra ...

  5. FL Studio钢琴卷轴之工具菜单的Riff命令

    鼠标左键点击FL Studio钢琴卷轴窗口中的"工具"命令,我们就可以打开快捷工具菜单.快捷菜单中包含了用于音符编辑的各种工具.按照该菜单的顺序,我们先来看一下什么是Riff器命令 ...

  6. 对TIMIT数据进行格式转换(SPHERE2WAV(RIFF))

    首先,转换sph2pipe工具所在文件夹(此工具为LDC所提供的SPHERE音频文件转换工具) cd '/home/dream/Research/kaldi-master/tools/sph2pipe ...

  7. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  8. FFmpeg + SoundTouch实现音频的变调变速

    本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...

  9. C++标准库实现WAV文件读写

    在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依赖于其他的库. WAV文件结构 ...

随机推荐

  1. 查看svn 提交记录

    svn log -v -r {2019-8-11}:{2019-8-16} -l 30 | sed -n '/wangyue01/,/--$/ p'其中:-r {2018-9-10}:{2018-9- ...

  2. Groovy脚本-通用SQL开关

    备注:使用Groovy语言进行编写,看不懂的同学请先了解Groovy脚本. Groovy学习地址:https://www.cnblogs.com/tiechui2015/p/10828457.html ...

  3. ANSYS中 *VWRITE命令使用

    目录 1. *VWRITE命令 2. Fortran字段描述符 1. *VWRITE命令 ANSYS输出结果到文件,采用*VWRITE命令,具体命令如下: *VWRITE,Par1,Par2,.... ...

  4. Qt QML Component 学习笔记

    简介 Component是Qt封装好的.只暴露必要接口的QML类型,可以重复利用.一个QML组件就像一个黑盒子,它通过属性.信号.函数和外部世界交互. 一个Component既可以定义在独立的QML文 ...

  5. 传奇脚本:#AutoRun NPC SEC 参数说明

    传奇脚本:#AutoRun NPC SEC 参数说明 SEC:按秒运行MIN:按分运行HOUR:按小时运行DAY:按天运行RunOnDay:按每天什么时候运行RUNONWEEK:按星期几及时间运行机器 ...

  6. IMDB-TOP_250-爬虫

    这个小学期Python大作业搞了个获取IMDB TOP 250电影全部信息的爬虫.第二次写爬虫,比在暑假集训时写的熟练多了.欢迎大家评论. ''' ************************** ...

  7. 记springboot 实体类String转Date类型的坑

    前端传入一个String的时间字符串如:2019-07-18 23:59:59 后端实体类要在头顶加注解: @DateTimeFormat(pattern = "yyyy-MM-dd HH: ...

  8. put、patch与post区别

    idempotent 幂等的 如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的:  idempotent的意思是如果相同的操作再執行第二遍第三遍,結果還是一樣. POST方法 ...

  9. mac下Red Hat 7.4服务器初始化

    物料:VMware Fusion for Mac版     rhel-server-7.4-x86_64-dvd.iso 通过VMware安装好虚拟机,打开终端: 1.通过ifconfig查看ip和网 ...

  10. 吴裕雄 python 神经网络——TensorFlow训练神经网络:花瓣识别

    import os import glob import os.path import numpy as np import tensorflow as tf from tensorflow.pyth ...