AVI RIFF Format
Clean 080830 晚
文件包含3部分,2个LIST(必须包括) + 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;
表1:fccType
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打开1个AVI文件你就会看到类似图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