AVI RIFF 格式说明

 

AVI RIFF 格式说明 收藏

 

AVI RIFF Format  

                   Clean  080830 晚

文件包含3部分,2LIST(必须包括) + 1个索引(可选)。

RIFF ('AVI '
      LIST ('hdrl' ... )
      LIST ('movi' ... )
      ['idx1' (<AVI Index>) ]
     )

LIST1  hdrl 可以理解为文件的头信息

LIST2  movi 为实际音视频数据。

进一步细分的结构为:

RIFF ('AVI '
      LIST ('hdrl'
            'avih'(<Main AVI Header>)
            LIST ('strl'
                  'strh'(<Stream header>)
                  'strf'(<Stream format>)
                  [ 'strd'(<Additional header data>) ]
                  [ 'strn'(<Stream name>) ]
                  ...
                 )
             ...
           )
      LIST ('movi'
            {SubChunk | LIST ('rec '
                              SubChunk1
                              SubChunk2
                              ...
                             )
               ...
            }
            ...
           )
      ['idx1' (<AVI Index>) ]
     )

1) LIST ‘hdrl’文件头信息

‘avih’  AVI文件的主要头信息,包含整个AVI文件的全局信息。内容为:

typedef struct _avimainheader {

    FOURCC fcc;  固定为   ’avih’

    DWORD  cb;    该结构体的大小,不包含开始的8个字节

    DWORD  dwMicroSecPerFrame;  相邻帧 间隔微秒数

    DWORD  dwMaxBytesPerSec;   文件最大数据率,单位字节

    DWORD  dwPaddingGranularity;  对齐格式,如字对齐 8字节对齐,单位字节

    DWORD  dwFlags;   一些标识

    DWORD  dwTotalFrames;  总帧数  

    DWORD  dwInitialFrames;   对于音视频交叉存取文件,该值为视频前面音频帧数(至少可以播放0.75秒的音频);否则为0

    DWORD  dwStreams;   音视频流总路数;

    DWORD  dwSuggestedBufferSize;   建议缓冲大小,应该大于文件中最大chunk,分配太小,或设置为0,这样将由播放器来裁决,可能会影响性能。

    DWORD  dwWidth;    视频宽,单位pixel

    DWORD  dwHeight;      

    DWORD  dwReserved[4]; 保留位,为0

AVIMAINHEADER;

 

‘strl’

音视频流列表,有1个流,就有一个对应的strl.

 

‘strh’ 描述流信息

typedef struct _avistreamheader {

     FOURCC fcc;      ‘strh’

     DWORD  cb;        同上

     FOURCC fccType;   用来区分音视频流,如表1所示

     FOURCC fccHandler;   可选,表明codec

     DWORD  dwFlags;   一些标识,AVISF_DISABLED和调色板标识。

     WORD   wPriority;   流的优先级,只有同一类型的流,有多个时,优先级高的为默认流。

     WORD   wLanguage;

     DWORD  dwInitialFrames;  dwInitialFrames 

     DWORD  dwScale;  时间基准,如30000 90000

     DWORD  dwRate;   对于视频dwRate/dwScale 为帧率,对于PCM音频为采样率。

     DWORD  dwStart;   流开始时间。通常为0,除非文件打开后有延时。

     DWORD  dwLength;   尚未弄明白。 

     DWORD  dwSuggestedBufferSize;  给解码器用的建议缓冲大小

     DWORD  dwQuality;      传给压缩软件的质量值为0-10000间数,写为-1时,使用默认质量值。

     DWORD  dwSampleSize;  样本大小,对于视频来讲就是该帧数据大小,如果每个样本大小相同可以多个样本放在1起,否则需要分开放。不然区分不出来了。

     struct {

         short int left;

         short int top;

         short int right;

         short int bottom;

     }  rcFrame;  支持多个视频流时,才会起到真正作用,否则和dwWidth等值一致。

} AVISTREAMHEADER;

 

 

1fccType

FOURCC

Description

'auds'

Audio stream

'mids'

MIDI stream

'txts'

Text stream

'vids'

Video stream

'strf':流格式

描述流数据格式,对于视频流为 BITMAPINFO结构体内容,个人觉得此处如果为类似DIVX压缩格式的视频的话,就不是这个结构体了。对于音频流为WAVEFORMATEX结构体。

typedef struct {

  WORD  wFormatTag;

  WORD  nChannels;

  DWORD nSamplesPerSec;

  DWORD nAvgBytesPerSec;

  WORD  nBlockAlign;

  WORD  wBitsPerSample;

  WORD  cbSize;

} WAVEFORMATEX; 

 

对于’strd’’strn’与编解码器的驱动器有关,对于AVI文件读写是不需要的。

以上讲述内容实例如图1所示。使用Hex WorkShop打开1AVI文件你就会看到类似图1信息。

图1   文件头信息示例

2) LIST ‘movi’ 文件数据部分

音视频实际数据可以直接放在list中或者成批量放到List rec中,在每一个样本前面会有1个数据类型标识用来区分是哪一个流,其格式为 stream num + type

其中 数据流序号是按照数据流在文件中的先后顺序定义的,先后次序该值依次为 00 01 02…. type 如表2所示

2:数据类型

db

Uncompressed video frame

dc

Compressed video frame

pc

Palette change

wb

Audio data

例如:音视频流AVI文件,音频在前,则音频数据前的标识符为: 00wb 压缩数据前面的为 01dc

 

紧跟其后的为 数据长度+实际数据

3) 索引

用来表示每个数据块在文件的位置。

typedef struct _avioldindex {

   FOURCC  fcc;

   DWORD   cb;

   struct _avioldindex_entry {

      DWORD   dwChunkId;

      DWORD   dwFlags;

      DWORD   dwOffset;

      DWORD   dwSize;

  } aIndex[];

} AVIOLDINDEX;

 

欢迎大家一起讨论,目前AVI如何封装mp4我还是不太明白,和以上格式有和区别?

转自http://blog.csdn.net/clebean/archive/2008/09/14/2853444.aspx

 

你可能感兴趣的:(AVI RIFF 格式说明)