首页 > 音视频技术 > AVI文件详细解析
2016
02-23

AVI文件详细解析

最近在做视频文件的解析,需要将视频文件中封装的视频与音频解析出来,然后用自己的解码器解码。这个过程专业点叫做叫做Demultiplex,视频播放器中负责这部分的叫做Demuxer。我们平时看到的各种格式视频,比如:avi,mp4,mkv等相当于一种容器,里面包含了音视频,字幕的信息以及数据,Demuxer的工作就是解析视频文件,取出里面的音视频或者字幕送到指定的解码器解码。

我刚开始接触的avi文件的解析。首先介绍下AVI文件。AVI英文全称为Audio Video Interleaved,即音视频交错格式,AVI基于RIFF文件结构。

一.基本数据单元

在AVI中有两种最基本的数据单元,一个是chunk,一个是list。这两种结构如下:

可知chunk由三部分组成:4字节的标记ID,4字节大小(指数据大小),以及数据。
list由四部分组成,4字节“list”,4字节大小(指后面两部分),4字节列表类型,数据。

二.AVI文件类型

1.AVI 1.0 最基本的格式,由于索引地址与大小用4字节表示,所以最大支持4G容量,而且与文件系统类型有关,如下:
–Video for Windows (AVI 1.0)
-FAT (FAT16): 4 GB (2 GB practical, safe)
-FAT32: 4 GB (2 GB practical, safe)
-NTFS: 4 GB (2 GB practical, safe)
为了安全一般限制为2G(参考链接1)
2.AVI 2.0(Open—DML) AVI的扩展格式,解决AVI 1.0大小限制(AVI2.0详细资料见参考链接2)

本文主要讨论AVI 1.0,AVI2.0解析后续再做研究。

三.AVI结构

一个AVI文件通常有如下几个子块组成:
1)ID为”hdrl”的list,包含了音视频信息,描述媒体流信息
2)ID为”info”的list,包含编码该AVI的程序信息
3)ID为”junk”的chunk,都是些无用的数据
4)ID为”movi”的list,包含了交错排列的音视频数据
5)ID为”idxl”的chunk,包含音视频排列的索引数据(可选块)

具体如下图所示(盗的图):

AVI文件详细解析 - 第1张  | Jianchihu

四.详细解析

1.RIFF文件头

用UltraEdit(或者其他文本编辑器)打开一个AVI文件(本文分析用到的avi文件下载地址)
AVI文件详细解析 - 第2张  | Jianchihu
可以看到前4个字节为”RIFF”,接着4字节RIFF文件大小(0x01811050即25235536字节,因为AVI文件以小端方式存储数据),再接着4字节为RIFF文件类型”avi”

2.hdrl列表

1)hdrl list头部
AVI文件详细解析 - 第3张  | Jianchihu
可以看到接下来为hdrl list。首先是4字节的”list”,然后4字节list大小,接着是4字节list类型”hdrl”。

2)avih块
AVI文件详细解析 - 第4张  | Jianchihu
用于描述主信息头。
4字节的”avih”标识,4字节大小(0x38即56),接下来是56个字节数据。该块可以用如下结构体表示:

3)strl list头部
AVI文件详细解析 - 第5张  | Jianchihu
一个strl list中至少包含一个strh块和一个strf块。文件中有多少个流,就对应有多少个strl list。
上图可知依次为4字节”list”,4字节的list大小,4字节”strl”标识。

4)strh块
AVI文件详细解析 - 第6张  | Jianchihu
用于描述流的头信息。
4字节”strh”,4字节”strh”块大小(0x38即56),后面是56字节大小数据。该块用如下结构体表示:

5)strf块
AVI文件详细解析 - 第7张  | Jianchihu
该块用于描述流的具体信息。如果是视频流(vids,由strh块得知),用一个BitmapInfo结构体表示,如果是音频流(auds),用WaveFormatEx结构体表示。

该块首先4字节”strf”标识,4字节大小0x28即40,接着的数据用一个40字节大小的BitmapInfo结构体表示。

6)strd块与strh块
strd:可选的额外的头信息数据
strn:可选的流的名字
这两个块是可选的,本AVI文件不包含,故不分析。

7)strl list
AVI文件详细解析 - 第8张  | Jianchihu
由于该AVI文件有两个流,所以有两个strl list。该strl list用于描述音频流信息。具体分析同上。

3.info list

AVI文件详细解析 - 第9张  | Jianchihu
该list用于描述编码该AVI文件的程序信息,包含一个isft块。

4.junk块

AVI文件详细解析 - 第10张  | Jianchihu
该块都是一些垃圾填充数据,用于内部数据的队齐(填充),直接跳过。

5.movi list

AVI文件详细解析 - 第11张  | Jianchihu
该list存储音视频数据块,音视频数据块在该list中交错方式存放着。
movi lst中音视频数据子块的种类有:##db,##dc,##pc,##wb。
–##表示数据所属的流的序号(由于第一个流是视频(第一个hdrl list描述视频),故音频用01wb表示,视频用00dc或00db)
–db:未压缩的视频帧
–dc:压缩的视频帧
–wb:音频数据
–pc:改用新的调色板

6.idx1块

AVI文件详细解析 - 第12张  | Jianchihu
该块是可选的,描述音视频数据的索引块信息。索引块可用如下结构体表示:

在AVIMainHeader的dwFlags中指出是否包含索引块。有了索引块可以方便文件快进,如果没有索引块,在对AVI进行快进时需要计算位置,会很耗时。

五.程序编写

通过如上分析对AVI结构有了清楚了解。在这基础上自己写了个AVI解析程序,可以解析AVI1.0格式文件,同时生成对应的视频与音频文件。
我用ffmpeg自带的ffplay测试解析生成的h264视频文件,可以正常播放。
AVI文件详细解析 - 第13张  | Jianchihu

参考链接
1)http://www.myvideoproblems.com/Tutorials/dv-aviFiles.htm
2)http://jchblog.u.qiniudn.com/doc/odmlff2.pdf

最后编辑:
作者:Jianchihu
管理员——低调做事,低调做人

5 Responses to AVI文件详细解析

  1. 陈群 says:
    Unknown Unknown Unknown Unknown

    楼主。。您好。。最近在分析AVI文件格式。。有文中提到的AVI2.0相关的文档参考下嘛??请给我一份。。谢谢了。。

  2. 樊聪 says:

    楼主你好,请问能否发一份你的AVI解析程序我啊?我这边想参考一下,麻烦了,谢谢!

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.