视频文件头解析--avi-代码解析

本文详细解析了AVI文件的头结构,包括avi_file_header、avi_mainheader、avi_streamheader和avi_bitmapinfo等数据结构,以及解码流程,如avi_stream_verify和stream_file_avi_head_parser函数。通过这些解析,可以理解AVI文件中视频和音频流的格式信息和编码方式。
摘要由CSDN通过智能技术生成

代码解析

数据结构:

1typedef 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

{

           // 指定这个流(视频流或文字流)在视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值