代码解析
数据结构:
1、typedef struct def_avi_file_header
{
def_avi_dword cb_file_type;
def_avi_dword cb_file_size;
def_avi_dword cb_video_type;
def_avi_dword cb_file_list;
def_avi_word cb_file_char;
def_avi_word cb_file_conut;
}def_avi_file_header;
2、'avih'块的数据结构
用于记录AVI文件的全局信息,比如流的数量、视频图像的宽和高等,可以使用一个avi_mainheader数据结构来操作
typedef structdef_avi_mainheader
{
def_avi_fourcc fcc_avih;// 必须为'avi ’
def_avi_dword cb_struct_size;// 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
def_avi_dword dwMicroSecPerFrame;// 视频帧间隔时间(以毫秒为单位)
def_avi_dword dwMaxBytesPerSec;// 这个AVI文件的最大数据率
def_avi_dword dwPaddingGranularity; //数据填充的粒度
def_avi_dword dwFlags;// AVI文件的全局标记,比如是否含有索引块等
/*Index at end of file? */
#defineBAVI_F_HASINDEX 0x00000010u
#defineBAVI_F_MUSTUSEINDEX 0x00000020u
#defineBAVI_F_ISINTERLEAVED 0x00000100u
/*Use CKType to find key frames */
#defineBAVI_F_TRUSTCKTYPE 0x00000800u
#defineBAVI_F_WASCAPTUREFILE 0x00010000u
#defineBAVI_F_COPYRIGHTED 0x00020000u
def_avi_dword dwTotalFrames;// 总帧数
def_avi_dword dwInitialFrames;// 为交互格式指定初始帧数(非交互格式应该指定为0)
def_avi_dword dwStreams;// 本文件包含的流的个数
def_avi_dword dwSuggestedBufferSize;//建议读取本文件的缓存大小(应能容纳最大的块)
def_avi_dword dwWidth;// 视频图像的宽(以像素为单位)
def_avi_dword dwHeight;// 视频图像的高(以像素为单位)
def_avi_dword dwReserved[4];// 保留
}def_avi_mainheader;
3、'strl'子列表数据结构--'strh'块
在'avi'块之后'就是一个或多个'strl'子列表。(文件中有多少个流,这里就对应有多少个'strl'子列表)每个'strl'子列表至少包含一个'strh' 块和一个'strf'块,而'strd'块(保存编解码器需要的一些配置信息)和'strn'块(保存流的名字)是可选的。首先是'strh'块,用于说明这个流的头信息,可以使用一个avi_streamheader数据结构来操作:
typedef structdef_avi_streamheader
{
def_avi_fourccfcc_strh; // 必须为'strh'
def_avi_dwordcb_struct_size;// 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
def_avi_fourcc fccType; // 流的类型:'auds'(音频流).'vids'(视频流).'mids'(MIDI流).'txts(文字流)
def_avi_fourccfccHandler;// 指定流的处理者,对于音视频来说就是解码器
def_avi_dword dwFlags;// 标记:是否允许这个流输出?调色板是否变化?
#defineBAVI_SF_DISABLED 0x00000001u
#defineBAVI_SF_VIDEO_PALCHANGES 0x00010000u
def_avi_word wPriority; // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)
def_avi_word wLanguage;
def_avi_word dwInitialFrames;// 为交互格式指定初始帧数
def_avi_dword dwScale;// 这个流使用的时间尺度
def_avi_dword dwRate;
def_avi_dword dwStart;// 流的开始时间
def_avi_dword dwLength;// 流的长度(单位与dwScale和dwRate的定义有关)
def_avi_dword dwSuggestedBufferSize;//读取这个流数据建议使用的缓存大小
def_avi_dword dwQuality; // 流数据的质量指标(0 ~ 10,000)
def_avi_dword dwSampleSize;// Sample的大小
struct
{
// 指定这个流(视频流或文字流)在视频