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

  • 相关阅读:
    苹果一体机发射Wi-Fi
    iphone 屏蔽系统自动更新,消除设置上的小红点
    data parameter is nil 异常处理
    copy与mutableCopy的区别总结
    java axis2 webservice
    mysql 远程 ip访问
    mysql 存储过程小问题
    mysql游标错误
    is not writable or has an invalid setter method错误的解决
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/10850601.html
Copyright © 2011-2022 走看看