avi 格式详解

http://blog.csdn.net/becomly/article/details/6283004

http://blog.csdn.net/easecom/article/details/4508094

VI(Audio Video Interleaved 的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序 中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也 是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。

先来介绍RIFF文件格式。RIFF文件使用四字符码FOURCC(four-character
code)来表征数据类型,比如‘RIFF’、 ‘AVI
’、‘LIST’等。注意,Windows操作系统使用的字节顺序是little-endian,因此一个四字符码‘abcd’实际的
DWORD值应为0x64636261。另外,四字符码中像‘AVI ’一样含有空格也是合法的。

RIFF文件首先含有一个文件头结构。

最开始的4个字节是一个四字符码‘RIFF’,表示这是一个RIFF文件;紧跟着后面用4个字节表示此RIFF文件的大小;然后又是一个四
字符码说明文件 的具体类型(比如AVI、WAVE等);最后就是实际的数据。注意文件大小值的计算方法为:实际数据长度 +
4(文件类型域的大小);也就是说,文件大 小的值不包括‘RIFF’域和“文件大小”域本身的大小。

RIFF文件的实际数据中,通常还使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套子列表和块。其中,列表的结构
为:‘LIST’ listSize listType listData ——‘LIST’是一个四字符码,表示这是一个列表;listSize占用4

字节,记录了整个列表的大小;listType也是一个四字符码,表示本列表的具体类型;listData就是实际的列表数据。注意listSize值的
计算方法为:实际的列表数据长度 + 4(listType域的大小);也就是说listSize值不包括‘LIST’域和listSize域本身的大
小。再来看块的结构:ckID ckSize ckData ——ckID是一个表示块类型的四字符码;ckSize占用4字节,记录了整个块的大
小;ckData为实际的块数据。注意ckSize值指的是实际的块数据长度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的内容中,
将以LIST ( listType ( listData ) )的形式来表示一个列表,以ckID ( ckData )的形式来表示一个块,如 [
optional element ]中括号中的元素表示为可选项。)

接下来介绍AVI文件格式。AVI文件类型用一个四字符码‘AVI ’来表示。整个AVI文件的结构为:一个RIFF头 + 两个列表(一个用于描述媒体流格式、一个用于保存媒体流数据) + 一个可选的索引块。AVI文件的展开结构大致如下:

RIFF (‘AVI ’
       LIST (‘hdrl’
             ‘avih’(主AVI信息头数据)
             LIST (‘strl’
                   ‘strh’ (流的头信息数据)
                   ‘strf’ (流的格式信息数据)
                   [‘strd’ (可选的额外的头信息数据) ]
                   [‘strn’ (可选的流的名字) ]
                   ...
                  )
              ...
            )
       LIST (‘movi’
             { SubChunk | LIST (‘rec ’
                               SubChunk1
                               SubChunk2
                               ...
                              )
                ...
             }
             ...
            )
       [‘idx1’ (可选的AVI索引块数据) ]
      )
[email protected]:~/download$ hexdump  -n 256 -C "[H264 [email protected] 480P AC3 1M] Animal.2005.avi"
00000000  52 49 46 46 18 75 c7 2b  41 56 49 20 4c 49 53 54  |RIFF.u.+AVI LIST|
00000010  72 22 00 00 68 64 72 6c  61 76 69 68 38 00 00 00  |r"..hdrlavih8...|
00000020  ec a2 00 00 00 00 00 00  00 00 00 00 10 01 00 00  |................|
00000030  eb 0b 02 00 00 00 00 00  02 00 00 00 00 00 00 00  |................|
00000040  80 02 00 00 50 01 00 00  00 00 00 00 00 00 00 00  |....P...........|
00000050  00 00 00 00 00 00 00 00  4c 49 53 54 94 10 00 00  |........LIST....|
00000060  73 74 72 6c 73 74 72 68  38 00 00 00 76 69 64 73  |strlstrh8...vids|
00000070  78 32 36 34 00 00 00 00  00 00 00 00 00 00 00 00  |x264............|
00000080  7d 00 00 00 b5 0b 00 00  00 00 00 00 eb 0b 02 00  |}...............|
00000090  c7 03 01 00 10 27 00 00  00 00 00 00 00 00 00 00  |.....‘..........|
000000a0  80 02 50 01 73 74 72 66  28 00 00 00 28 00 00 00  |..P.strf(...(...|
000000b0  80 02 00 00 50 01 00 00  01 00 10 00 48 32 36 34  |....P.......H264|
000000c0  00 b0 13 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000d0  00 00 00 00 4a 55 4e 4b  18 10 00 00 00 00 00 00  |....JUNK........|
000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

[email protected]:~/download$ hexdump  -s 4340 -n 256 -C "[H264 [email protected] 480P AC3 1M] Animal.2005.avi"000010f4  4c 49 53 54 7e 10 00 00  73 74 72 6c 73 74 72 68  |LIST~...strlstrh|00001104  38 00 00 00 61 75 64 73  00 00 00 00 00 00 00 00  |8...auds........|00001114  00 00 00 00 01 00 00 00  01 00 00 00 60 6d 00 00  |............`m..|00001124  00 00 00 00 00 09 56 09  b0 36 00 00 ff ff ff ff  |......V..6......|00001134  01 00 00 00 79 00 74 00  6d 00 6d 00 73 74 72 66  |....y.t.m.m.strf|00001144  12 00 00 00 00 20 06 00  80 bb 00 00 60 6d 00 00  |..... ......`m..|00001154  01 00 00 00 00 00 4a 55  4e 4b 18 10 00 00 00 00  |......JUNK......|00001164  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|*000011f4[email protected]:~/download$ hexdump  -s 156 -n 256 -C "[H264 [email protected] 480P AC3 1M] Animal.2005.avi"0000009c  00 00 00 00 80 02 50 01  73 74 72 66 28 00 00 00  |......P.strf(...|000000ac  28 00 00 00 80 02 00 00  50 01 00 00 01 00 10 00  |(.......P.......|000000bc  48 32 36 34 00 b0 13 00  00 00 00 00 00 00 00 00  |H264............|000000cc  00 00 00 00 00 00 00 00  4a 55 4e 4b 18 10 00 00  |........JUNK....|000000dc  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|*0000019c[email protected]:~/download$ hexdump  -s 100 -n 256 -C "[H264 [email protected] 480P AC3 1M] Animal.2005.avi"00000064  73 74 72 68 38 00 00 00  76 69 64 73 78 32 36 34  |strh8...vidsx264|00000074  00 00 00 00 00 00 00 00  00 00 00 00 7d 00 00 00  |............}...|00000084  b5 0b 00 00 00 00 00 00  eb 0b 02 00 c7 03 01 00  |................|00000094  10 27 00 00 00 00 00 00  00 00 00 00 80 02 50 01  |.‘............P.|000000a4  73 74 72 66 28 00 00 00  28 00 00 00 80 02 00 00  |strf(...(.......|000000b4  50 01 00 00 01 00 10 00  48 32 36 34 00 b0 13 00  |P.......H264....|000000c4  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000000d4  4a 55 4e 4b 18 10 00 00  00 00 00 00 00 00 00 00  |JUNK............|000000e4  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|*00000164[email protected]:~/download$ hexdump  -s 730200168 -n 256 -C "[H264 [email protected] 480P AC3 1M] Animal.2005.avi"2b85f868  69 64 78 31 b0 7c 41 00  30 31 77 62 10 00 00 00  |idx1.|A.01wb....|2b85f878  04 00 00 00 b0 36 00 00  30 30 64 63 00 00 00 00  |.....6..00dc....|2b85f888  bc 36 00 00 00 00 00 00  30 31 77 62 10 00 00 00  |.6......01wb....|2b85f898  c4 36 00 00 90 04 00 00  30 30 64 63 00 00 00 00  |.6......00dc....|2b85f8a8  5c 3b 00 00 00 00 00 00  30 31 77 62 10 00 00 00  |\;......01wb....|2b85f8b8  64 3b 00 00 90 04 00 00  30 30 64 63 10 00 00 00  |d;......00dc....|2b85f8c8  fc 3f 00 00 fd 00 00 00  30 31 77 62 10 00 00 00  |.?......01wb....|2b85f8d8  02 41 00 00 90 04 00 00  30 30 64 63 00 00 00 00  |.A......00dc....|2b85f8e8  9a 45 00 00 15 00 00 00  30 31 77 62 10 00 00 00  |.E......01wb....|2b85f8f8  b8 45 00 00 90 04 00 00  30 30 64 63 00 00 00 00  |.E......00dc....|2b85f908  50 4a 00 00 12 00 00 00  30 31 77 62 10 00 00 00  |PJ......01wb....|2b85f918  6a 4a 00 00 90 04 00 00  30 30 64 63 00 00 00 00  |jJ......00dc....|2b85f928  02 4f 00 00 12 00 00 00  30 31 77 62 10 00 00 00  |.O......01wb....|2b85f938  1c 4f 00 00 8f 04 00 00  30 30 64 63 00 00 00 00  |.O......00dc....|2b85f948  b4 53 00 00 15 00 00 00  30 31 77 62 10 00 00 00  |.S......01wb....|2b85f958  d2 53 00 00 90 04 00 00  30 30 64 63 00 00 00 00  |.S......00dc....|

标准的类型码定义如下:‘db’(非压缩视频 帧)、‘dc’(压缩视频帧)、‘pc’(改用新的调色板)、‘wb’(音缩视频)。比如第一个流(Stream 0)是音频,则表征音频数据块的四字符 码为‘00wb’;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为‘00db’或‘00dc’。对于视频数据来说,在AVI数据序列 中间还可以定义一个新的调色板,每个改变的调色板数据块用‘xxpc’来表征,新的调色板使用一个数据结构AVIPALCHANGE来定义。(注意:如果 一个流的调色办中途可能改变,则应在这个流格式的描述中,也就是AVISTREAMHEADER结构的dwFlags中包含一个 AVISF_VIDEO_PALCHANGES标记。)另外,文字流数据块可以使用随意的类型码表征。

最后,紧跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可选的索引块。这个索引块为AVI文件中每一个媒体数据块进行索引,并且记 录它们 在文件中的偏移(可能相对于‘movi’列表,也可能相对于AVI文件开头)。索引块使用一个四字符码‘idx1’来表征,索引信息使用一个数据结构来 AVIOLDINDEX定义。

typedef struct _avioldindex {
    FOURCC   fcc;   // 必须为‘idx1’
    DWORD    cb;    // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
    struct _avioldindex_entry {
       DWORD    dwChunkId;    // 表征本数据块的四字符码
       DWORD    dwFlags;      // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息
       DWORD    dwOffset;     // 本数据块在文件中的偏移量
       DWORD    dwSize;       // 本数据块的大小
   } aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息
} AVIOLDINDEX;

注意:如果一个AVI文件包含有索引块,则应在主AVI信息头的描述中,也就是AVIMAINHEADER结构的dwFlags中包含一个AVIF_HASINDEX标记。

aa

avi 格式详解

时间: 2024-10-07 05:02:15

avi 格式详解的相关文章

BMP格式详解

BMP格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源.Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持. 下面以Notepad++为分析工具,结合

多媒体开发之---h264格式详解

http://blog.csdn.net/bluebirdssh/article/details/6533501 http://blog.csdn.net/d_l_u_f/article/details/7260772 http://blog.csdn.net/sunnylgz/article/details/7680262 http://blog.csdn.net/heanyu/article/details/6204414 多媒体开发之---h264格式详解,布布扣,bubuko.com

多媒体封装格式详解---MP4

MP4文件格式详解--结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags. 4. Header,包含了整个Box的长度size和类型type.当size==0时,代表这是文件中最后一个

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 2.为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处

(原创)高性能IP数据库格式详解 qqzeng-ip.dat

高性能IP数据库格式详解 qqzeng-ip.dat 编码:UTF8           字节序:Little-Endian 返回多个字段信息(如:亚洲|中国|香港|九龙|油尖旺|新世界电讯|810200|Hong Kong|HK|114.17495|22.327115) ------------------------ 文件结构 --------------------------- //文件头 16字节(4-4-4-4) [索引区第一条流位置][索引区最后一条流位置][前缀区第一条的流位置]

Linux下可执行文件格式详解

Linux下面,目标文件.共享对象文件.可执行文件都是使用ELF文件格式来存储的.程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件.Linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix系统的COFF文件格式演化来的. 我们先来了解一些基本的想法. 首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因: 1.程序执行之后,代码和数据可以被映射到不同属性的虚拟

(转)Excel自定义格式详解

”G/通用格式”:以常规的数字显示,相当于”分类”列表中的”常规”选项.例:代码:”G/通用格式”.10显示为10:10.1显示为10.1. 2. “#”:数字占位符.只显有意义的零而不显示无意义的零.小数点后数字如大于”#”的数量,则按”#”的位数四舍五入.例:代码:”###.##”,12.1显示为12.10;12.1263显示为:12.13 3.”0”:数字占位符.如果单元格的内容大于占位符,则显示实际数字,如果小于点位符的数量,则用0补足.例:代码:”00000”.1234567显示为12

FLV格式详解

Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV header 和 The FLV File Body 组成. 1.The FLV header Field Type Comment Signature UI8 Signature byte always 'F' (0x46) Signature UI8 Signature byte always

php 序列化(serialize)格式详解

1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列化结果的格式却没做任何说明.因此,这对在其他语言中实现 PHP 方式的序列化来说,就比较麻烦了.虽然以前也搜集了一些其他语言实现的 PHP 序列化的程序,不过这些实现都不完全,当序列化或反序列化一些比较复杂的对象时,就会出错了.于是我决定写一份关于 PHP 序列化格式详解的文档(也就是这一篇文档),