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我还是不太明白,和以上格式有和区别?
L
本文详细介绍了AVI文件的内部结构,包括文件头信息、实际音视频数据和可选索引部分。通过具体实例和代码结构说明了AVI文件如何组织音视频数据,并解释了不同类型数据的标识方式。
941

被折叠的 条评论
为什么被折叠?



