zoukankan      html  css  js  c++  java
  • RIFF格式简介

    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”文件结构。

    RIFF chunk that contains two subchunks image

     包含在一个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 chunk that contains a LIST chunk image

     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) << 8) |   
        ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )); 

    也可使用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

  • 相关阅读:
    WebSocket面试题
    面试题、四
    面试题、三
    面试题、二
    面试题、一
    vue 使用localstorage实现面包屑
    flutter,SliverPersistentHeader实现Tab顶部吸附固定效果
    对flutter中,ExpsionPanel的简单改造
    node.js学习笔记
    PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
  • 原文地址:https://www.cnblogs.com/tocy/p/RIFF_FILE.html
Copyright © 2011-2022 走看看