首页 > 音视频 > 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张  | 剑痴乎

四.详细解析

1.RIFF文件头

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

2.hdrl列表

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

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

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

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

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

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

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

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

3.info list

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

4.junk块

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

5.movi list

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

6.idx1块

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

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

五.程序编写

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

参考链接
1)http://www.myvideoproblems.com/Tutorials/dv-aviFiles.htm
2)odmlff2.pdf:https://pan.baidu.com/s/1CXiargLfspQwaWoRYjqHqw 提取码: haj8

最后编辑:
作者:Jeff
Avatar
管理员——代码为剑,如痴如醉

5 Responses to AVI文件详细解析

  1. Avatar 陈群 says:
    Unknown Unknown Unknown Unknown

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

  2. Avatar 樊聪 says:
    Google Chrome 55.0.2883.87 Google Chrome 55.0.2883.87 Windows 7 Windows 7

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

    • Avatar Jianchihu says:
      Google Chrome 62.0.3202.94 Google Chrome 62.0.3202.94 Windows 10 x64 Edition Windows 10 x64 Edition

      这个给不了,公司写的代码。你可以参考ffmepg或vlc源码。

留下一个回复

你的email不会被公开。

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