zoukankan      html  css  js  c++  java
  • RIFF

    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) << 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在编译就能生成出来。

  • 相关阅读:
    调试技术能够让新技术的学习事半功倍
    世界500强绩效考核(KPI) [11]
    .NET 4.0新功能介绍:In Process Side By Side
    What's New in the .NET Framework Version 4
    Production Debugging for .NET Framework Applications
    Project 2007下的自动计算问题
    SQL操作全集
    WPF1.1 理解Windows图形
    .NET Framework Version 4 Application Compatibility Walkthrough
    Fixing BizTalk ENTSSO Failure on Windows 7, Vista or Server 2008 after .NET 4.0 Installation
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/10850601.html
Copyright © 2011-2022 走看看