AVI文件分析解析

1.概述

    AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)
是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI
都采用这种格式存储。

 

2.RIFF文件结构

    构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分:

  1、4字节的数据块ID

  2、数据块的大小

  3、数据

 

    这是一个chunk的例子
    Chunk ID   Size       Data
    avih       38     dwMicroSecPerFrame    : 33367
                      dwMaxBytesPerSec      : 3728000
                      ......

 

    整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。所有其他块都是RIFF块的子块,子块有两类,其中有一种子块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块。另一类不能包含子块的,暂且称为普通子块。可见RIFF文件是按树形结构被组织

    下面是一个RIFF文件结构的例子
          + RIFF
          |    + LIST
          |    |    + sub chunk
          |    |    + LIST
          |    |    |    + sub chunk
          |    |    |    + sub chunk
          |    |    |    + sub chunk
          |    |    + LIST
          |    |    |    + sub chunk
          |    |    |    + sub chunk
          |    |    |    + sub chunk
          |    |    + sub chunk
          |    + LIST
          |    + sub chunk

 

    RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下:

  1、4字节的数据块标记(Chunk ID)

  2、数据块的大小

  3、4字节的形式类型或者列表类型

  4、数据

 

3. AVI文件结构
    AVI文件就是RIFF文件结构的一个具体应用。这就好比你基于xml文件格式设计了一个档案管理系统数据库。xml文件格式是一套描述内容该如何被组织起来的规则,你按照这个规则把档案数据组织起来,形成一个具体应用。这里xml文件格式就是RIFF文件格式,档案管理系统数据库就是AVI文件。

 

    接下来我们看看AVI文件格式
    AVI的RIFF块的形式类型是AVI,在RIFF块下,它包含3个子块,如下所述:

  1、信息块,一个列表类型为"hdrl"的LIST块,定义AVI文件的数据格式。

  2、数据块,一个列表类型为 "movi"的LIST块,包含AVI的音视频序列数据。

  3、索引块,ID为 "idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。

          + RIFF-AVI 
          |    + LIST-hdrl
          |    + LIST-movi
          |    + idx1


    下面是一个AVI文件的例子,每行的格式是
    CHUNK ID-FORMTYPE/LISTTYPE  size:xxxxx
          + RIFF-AVI  size:23370530
          |    + LIST-hdrl size:8810
          |    |    + avih size:56
          |    |    + LIST-strl size:4240
          |    |    |    + strh size:56
          |    |    |    + strf size:40
          |    |    |    + JUNK size:4116
          |    |    + LIST-strl size:4218
          |    |    |    + strh size:56
          |    |    |    + strf size:18
          |    |    |    + JUNK size:4116
          |    |    + JUNK size:260
          |    + LIST-movi size:23286940
          |    |    + 00wb chunk
          |    |    + 00dc chunk
          |    + idx1 size:74752  

 

    avih chunk描述文件整体信息,比如:包含的节目流数,最大数据传输率,是否有索引,图像的长宽。
    strl list chunk描述一个数据流,一般avi有一个音频流和一个视频流,因此就会出现两个strl list chunk。 每个数据流由三个子块描述:strh,strf,strd。

 

    strh包含如下信息:
   FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流,auds 音频数据流
   FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
   DWORD dwFlags; //数据流属性
   WORD wPriority; //此数据流的播放优先级
   WORD wLanguage; //音频的语言代号
   DWORD dwInitalFrames;//说明在开始播放前需要多少桢
   DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
   DWORD dwRate; //dwScale /dwRate = 每秒的采样数
   DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
   DWORD dwLength; //数据流的数据量,以dwScale为单位
   DWORD dwSuggestedBufferSize; //建议缓冲区的大小
   DWORD dwQuality; //解压缩质量参数,值越大,质量越好
   DWORD dwSampleSize; //音频的采样大小
   RECT rcFrame; //视频图像所占的矩形

 

    "strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh 子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图结构,如下:
   DWORD biSize;
   LONG biWidth;
   LONG biHeight;
   WORD biPlanes;
   WORD biBitCount;
   DWORD biCompression;
   DWORD biSizeImage;
   LONG biXPelsPerMeter;
   LONG biYPelsPerMeter;
   DWORD biClrUsed;
   DWORD biClrImportant;
    RGBQUAD bmiColors[1]; //颜色表

 

    如果 strh子块是音频数据流,则strf子块的结构如下:
   WORD wFormatTag;
   WORD nChannels; //声道数
   DWORD nSamplesPerSec; //采样率
   DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
   WORD nBlockAlign; //数据块的对齐标志
   WORD biSize; //此结构的大小

 

    "strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。

 

    "strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。

    数据块中存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据块中音视频数据按不同的子块存放,其结构如下所述,

    "00wb" Wave 数据流
    "00db" RGB数据流 或 "00dc" 压缩的图像数据流

    avi文件的图像数据可以是压缩的,和非压缩格式的。对于压缩格式来说,也可采用不同的编码。AVI的编码方式有很多种,比较常见的有 mpeg2,mpeg4,divx等。 

 

    索引块,索引快包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据 格式如下,这个块并不是必需的。
 DWORD ckid; //记录数据块中子块的标记
 DWORD dwFlags; //表示chid所指子块的属性
 DWORD dwChunkOffset; //子块的相对位置
 DWORD dwChunkLength; //子块长度   

 

附录
一个包含完整信息块的avi例子
每行的格式为
POS   CHUNK ID (size)  FORMTYPE/LISTTYPE

00000000 RIFF (103E2920) 'AVI '
0000000C     LIST (00000146) 'hdrl'
00000018         avih (00000038)
                     dwMicroSecPerFrame    : 33367
                     dwMaxBytesPerSec      : 3728000
                     dwPaddingGranularity  : 0
                     dwFlags               : 0x810 HASINDEX | TRUSTCKTYPE
                     dwTotalFrames         : 2192
                     dwInitialFrames       : 0
                     dwStreams             : 2
                     dwSuggestedBufferSize : 120000
                     dwWidth             

你可能感兴趣的:(流媒体,媒体格式,Multimedia)