RIFF

RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构。RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF格式存储的数据及对应文件有:
- 音频视频交错格式数据 .AVI
- 波形格式数据 .WAV
- 位图数据格式 .RDI
- MIDI格式数据 .RMI
- 调色板格式 .PAL
- 多媒体电影 .RMN
- 动画光标 .ANI
- 其他的RIFF文件 .BND

CHUNK

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

struct chunk
{uint32_t id;         /* 块标志 */uint32_t size;       /* 块大小 */uint8_t data[size];  /* 块数据 */
};

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

chunk是可以嵌套的,但是只有块标志为RIFF或者LIST的chunk才能包含其他的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有包含有自己的标识、数据域的大小以及数据域。
除了RIFF cunk可以嵌套其他的chunk外,另一个可以有subchunk的就是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) << 8 ) | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )

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

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

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

WAV文件

WAV 是Microsoft开发的一种音频文件格式,它符合上面提到的RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。如下图:

一个WAV文件里,首先是一个RIFF chunk;RIFF chunk又包含有Format chunk,Data chunk以及可选的Fact chunk。各个chunk中字段的意义如下:

RIFF chunk

- id
FOURCC 值为’R’ ‘I’ ‘F’ ‘F’
- size
其data字段中数据的大小 字节数
- data
包含其他的chunk

Format chunk

-id
FOURCC 值为 ‘f’ ‘m’ ‘t’ ’ ‘
-size
数据字段包含数据的大小。如无扩展块,则值为16;有扩展块,则值为= 16 + 2字节扩展块长度 + 扩展块长度或者值为18(只有扩展块的长度为2字节,值为0)
-data
存放音频格式、声道数、采样率等信息
        -format_tag
         2字节,表示音频数据的格式。如值为1,表示使用PCM格式
        -channels
         2字节,声道数。值为1则为单声道,为2则是双声道
        -samples_per_sec
        采样率,主要有22.05KHz,44.1kHz和48KHz
        -bytes_per sec
        音频的码率,每秒播放的字节数。samples_per_sec * channels * bits_per_sample / 8,可以估算出使用缓冲区的大小
        -block_align
         数据块对齐单位,一次采样的大小,值为声道数 * 量化位数 / 8,在播放时需要一次处理多个该值大小的字节数据
         -bits_per_sample
         音频sample的量化位数,有16位,24位和32位等
         -cbSize
         扩展区的长度
         -扩展块内容
         22字节,具体介绍,后面补充

Fact chunk(option)

-id
FOURCC 值为 ‘f’ ‘a’ ‘c’ ‘t’
-size
数据域的长度,4(最小值为4)
-data
采样总数 4字节

Data chunk

-id
FOURCC 值为’d’ ‘a’ ‘t’ ‘a’
-size
数据域的长度
-data
具体的音频数据存放在这里

采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。

Data chunk的补充

Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推….。对于PCM数据,有以下两种的存储方式:

- 单声道,量化位数为8,使用偏移二进制码
- 除上面之外的,使用补码方式存储。

RIFF和WAVE文件格式相关推荐

  1. WAVE 文件格式分析

    WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.每个WAVE文件的头四个字节便是"RIF ...

  2. wave文件格式详解

    目录 第一节 wav格式scheme介绍 第二节 真实wav文件分析 第三节 python读取wav文件 第一节 wav格式scheme介绍 wav格式,是微软开发的一种文件格式规范,整个文件分为两部 ...

  3. 音频文件的结构与规范——RIFF和WAVE音频文件格式

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

  4. wave格式分析,wave音频文件格式分析配程序

    wav文件格式分析详解 程序如上一篇博文 一.综述     WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的. RIFF是英文Resource Interchange Fil ...

  5. (转)WAVE PCM 声音文件格式

    WAVE文件格式是Microsoft为存储多媒体的RIFF规范的一部分.一个RIFF文件以一个文件头开始,然后是一系列的数据块.一个WAVE文件常常仅由一个WAVE块构成,WAVE块包含一个说明格式的 ...

  6. Wave(.wav)文件格式

    Wave文件格式主要是用来存储音频PCM数据的,其实也可以存储非PCM音频数据,这种情况我们就不考虑了.文件的扩展名为".wav",采用RIFF文件结构. 一.RIFF文件格式简介 ...

  7. WAVE音频文件格式及其64位扩展格式的简要介绍

    正文 关于 WAVE 文件格式,网上有不少介绍,但关于WAVE 64位扩展格式的介绍却是几乎没有. 所以本文的目的是简要介绍标准的 WAVE 格式,以及两种主要的扩展格式. 文中所有代码都用C语言来描 ...

  8. pyglet wave.Error: file does not start with RIFF id

    最近使用pyglet来播放视频: import pyglet from pyglet.media import *window = pyglet.window.Window() player = Pl ...

  9. wav文件格式分析详解

    wav文件格式分析详解 作者:曹京 日期:2006年7月17日 一.综述     WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的. RIFF是英文Resource Inte ...

最新文章

  1. 机器视觉关键技术之图像增强技术
  2. mitmproxy 中间人代理工具,抓包工具,linux抓包工具 mitmproxy 使用
  3. Python 列表 list 数组 array
  4. 三、gridView增删改查
  5. 卢伟冰直播拆机 或是性价比最高的骁龙855手机
  6. 计算机专业岗位细分及学习必备清单
  7. JavaScript表单验证示例
  8. “雪糕刺客”你听说过,Bitmap这个“内存刺客”你也要小心(上)~
  9. JAVA ftps设置_如何使用apache.commons.net.ftps配置客户端身份验证?
  10. ubuntu 16.04软件源
  11. Floorplan的SSN(Simultaneous Switching Noise)问题
  12. GoTop给网站加一个悬挂猫效果上吊猫
  13. 使用 prometheus 监控 MySQL
  14. Ford-Fulkerson 最大流求解方法
  15. 【计算机网络】网络层精选习题1(含联考真题)
  16. context menu
  17. LevelDB 源码分析
  18. Dijkstra算法和A*算法总结
  19. 企业为什么需要信息化?
  20. 读取位置时发生访问冲突

热门文章

  1. 属于超级APP的时代过去了?
  2. 腾讯企点QTrade 金融OTC合规解决方案
  3. 可转债交易薅羊毛策略 — Python 量化投资实战教程(10)
  4. python海龟绘图小猪佩奇_海龟绘图(Turtle Graphics)
  5. Python-Turtle 简易教程
  6. 2022《中国企业敏捷实践白皮书》调研全面启动
  7. 使用matplotlib绘制3D图像时插入图片
  8. EAN13条形码了解,有c测试代码
  9. SSD1306显示屏--躲避类游戏
  10. 每日刷题记录 (六)