当前位置:首页 >> 信息与通信 >>

AVI格式


AVI(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 个字节表示此 RIF F 文件的大小;然后又是一个四字符码说明文件的具体类型(比如 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 域和 ckSiz e 域本身的大小。(注意:在下面的内容中,将以 LIST ( listType ( listData ) )的形式来表示一个列 表,以 ckID ( ckData )的形式来表示一个块,如[ optional element ]中括号中的元素表示为可选项。) 接下来介绍 AVI 文件格式。AVI 文件类型用一个四字符码‘AVI ’来表示。整个 AVI 文件的结构为:一个 R IFF 头 + 两个列表(一个用于描述媒体流格式、一个用于保存媒体流数据) + 一个可选的索引块。AVI 文 件的展开结构大致如下: RIFF (‘AVI ’ LIST (‘hdrl’ ‘avih’(主 AVI 信息头数据) LIST (‘strl’ ‘strh’ (流的头信息数据) ‘strf’ (流的格式信息数据) [‘strd’ (可选的额外的头信息数据) ] [‘strn’ (可选的流的名字) ] ... ) ... ) LIST (‘movi’ { SubChunk | LIST (‘rec ’

SubChunk1 SubChunk2 ... ) ... } ... ) [‘idx1’ (可选的 AVI 索引块数据) ] )

首先,RIFF (‘AVI ’?)表征了 AVI 文件类型。然后就是 AVI 文件必需的第一个列表——‘hdrl’列表, 用于描述 AVI 文件中各个流的格式信息(AVI 文件中的每一路媒体数据都称为一个流)。‘hdrl’列表嵌 套了一系列块和子列表——首先是一个‘avih’块,用于记录 AVI 文件的全局信息,比如流的数量、视频 图像的宽和高等,可以使用一个 AVIMAINHEADER 数据结构来操作: typedef struct _avimainheader { FOURCC fcc; DWORD cb; // 必须为‘avih’ // 本数据结构的大小,不包括最初的 8 个字节(fcc 和 cb 两个域) // 视频帧间隔时间(以毫秒为单位) // 这个 AVI 文件的最大数据率 // AVI 文件的全局标记,比如是否含有索引块等 // 总帧数 // 本文件包含的流的个数 // 视频图像的宽(以像素为单位) // 视频图像的高(以像素为单位) // 保留

DWORD dwMicroSecPerFrame; DWORD dwMaxBytesPerSec; DWORD dwFlags; DWORD dwTotalFrames; DWORD dwStreams; DWORD dwWidth; DWORD dwHeight; DWORD dwReserved[4]; } AVIMAINHEADER; dwlFlags 对应:

DWORD dwPaddingGranularity; // 数据填充的粒度

DWORD dwInitialFrames; // 为交互格式指定初始帧数(非交互格式应该指定为 0) DWORD dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)

AVIF_HASINDEX:标明该 AVI 文件有"idx1"块 AVIF_MUSTUSEINDEX:标明必须根据索引表来指定数据顺序 AVIF_ISINTERLEAVED:标明该 AVI 文件是 interleaved 格式的 AVIF_WASCAPTUREFILE:标明该 AVI 文件是用捕捉实时视频专门分配的文件 AVIF_COPYRIGHTED:标明该 AVI 文件包含有版权信息
然后,就是一个或多个‘strl’子列表。(文件中有多少个流,这里就对应有多少个‘strl’子列表。) 每个‘strl’子列表至少包含一个‘strh’块和一个‘strf’块,而‘strd’块(保存编解码器需要的一 些配置信息)和‘strn’块(保存流的名字)是可选的。首先是‘strh’块,用于说明这个流的头信息, 可以使用一个 AVISTREAMHEADER 数据结构来操作:

typedef struct _avistreamheader { FOURCC fcc; DWORD cb; FOURCC fccType; FOURCC fccHandler; DWORD WORD WORD DWORD DWORD DWORD DWORD DWORD DWORD DWORD DWORD dwFlags; wPriority; wLanguage; dwInitialFrames; dwScale; dwRate; dwStart; dwLength; dwSuggestedBufferSize; dwQuality; dwSampleSize; // 流的开始时间 // 流的长度(单位与 dwScale 和 dwRate 的定义有关) // 读取这个流数据建议使用的缓存大小 // 流数据的质量指标(0 ~ 10,000) // Sample 的大小 // 为交互格式指定初始帧数 // 这个流使用的时间尺度 // 必须为‘strh’ // 本数据结构的大小,不包括最初的 8 个字节(fcc 和 cb 两个域) // 流的类型:‘auds’(音频流)、‘vids’(视频流)、 //‘mids’(MIDI 流)、‘txts’(文字流) // 指定流的处理者,对于音视频来说就是解码器 // 标记:是否允许这个流输出?调色板是否变化? // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)

struct { short int left; short int top; short int right; short int bottom; } rcFrame; // 指定这个流(视频流或文字流)在视频主窗口中的显示位置 // 视频主窗口由 AVIMAINHEADER 结构中的 dwWidth 和 dwHeight 决定 } AVISTREAMHEADER; 然后是‘strf’块,用于说明流的具体格式。如果是视频流,则使用一个 BITMAPINFO 数据结构来描述;如 果是音频流,则使用一个 WAVEFORMATEX 数据结构来描述。 当 AVI 文件中的所有流都使用一个‘strl’子列表说明了以后(注意:‘strl’子列表出现的顺序与媒体 流的编号是对应的,比如第一个‘strl’子列表说明的是第一个流(Stream 0),第二个‘strl’子列表 说明的是第二个流(Stream 1),以此类推),‘hdrl’列表的任务也就完成了,随后跟着的就是 AVI 文 件必需的第二个列表—— ‘movi’ 列表, 用于保存真正的媒体流数据 (视频图像帧数据或音频采样数据等) 。 那么,怎么来组织这些数据呢?可以将数据块直接嵌在‘movi’列表里面,也可以将几个数据块分组成一 个‘rec ’列表后再编排进‘movi’列表。(注意:在读取 AVI 文件内容时,建议将一个‘rec ’列表中 的所有数据块一次性读出。)但是,当 AVI 文件中包含有多个流的时候,数据块与数据块之间如何来区别 呢?于是数据块使用了一个四字符码来表征它的类型,这个四字符码由 2 个字节的类型码和 2 个字节的流 编号组成。标准的类型码定义如下:‘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’来表征,索引信息使用一个数据结构来 AVIOLDIN DEX 定义。 typedef struct _avioldindex { FOURCC fcc; // 必须为‘idx1’ DWORD cb; // 本数据结构的大小,不包括最初的 8 个字节(fcc 和 cb 两个域) dwChunkId; dwFlags; dwOffset; dwSize; // 表征本数据块的四字符码 // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息 // 本数据块在文件中的偏移量 // 本数据块的大小 struct _avioldindex_entry { DWORD DWORD DWORD DWORD } AVIOLDINDEX; 注意:如果一个 AVI 文件包含有索引块,则应在主 AVI 信息头的描述中,也就是 AVIMAINHEADER 结构的 dw Flags 中包含一个 AVIF_HASINDEX 标记。 还有一种特殊的数据块,用一个四字符码‘JUNK’来表征,它用于内部数据的队齐(填充),应用程 序应该忽略这些数据块的实际意义。 AVI(Audio/Video Interleaved)文件是 MS-Windows 的视频文件,其文件扩展名为“.AVI”。它一 般由三部分构成:信息区、数据区和索引区(可缺省),即两个 LIST 快和一个 idx1 块。这些区域,通常 由一些子块组成,它们多用于为播放软件提供更为系统的数据信息;或为播放时进行快速数据定位及播放, 并提供详细资料和识别手段(关于“区域”与“子块”具体包容关系请见图 6)。 说明:本例由“四部分”构成,即在两个 LIST 块中间夹了个 JUNK 块。这个 JUNK 块纯属人为添加的自定义 块,即在 AVI 文件中从未有对此块的定义。换句话说,我们也可以添加自己的决,只要遵循如下原则:在 这三个标准块其中的某个后面,定义一个四字节的块识别码(不要与本文用到的识别码相同,最好字母用 大写),紧跟一个长整数来表示你自定义的块的大小,随后便可以在定义的大小范围内写入你想表述的信 息。同样,在这三个标准块的内部,也可以用上述方法添加自定义干块。 注:下文的说明内容部分取自华中理工大学出版的<>一文和<>的 HELP 文件。 以下就是作为例子的文件内容(数据 D)及 AVI 文件标准结构图。 1.从(00000000-000007F3)为一个 WindowsAVI 文件的信息区部分。 它是文件的第一个 LIST 块。 在它的内部记录着整个文件的系统构成, 如告诉播放软件 “我是一个 AVI 文件” ; “在我的体内有几个数据流”;“每个数据流包含着什么数据类型——图像、声音或其他”;“如果是图 像数据流,那么它的大小、颜色、压缩方式、播放速度等,等是怎样规定的”;“如果是声音数据流,那 么它的压缩方式、播放效果等等又将有何规定”......在信息区中还有多个附属的 LIST 块,也就是我们前 面提到的“子块”,它们用来记录每个数据流的全部信息。而这些附间 LIST 块与数据流之间保持着—一对 应的关系,即 第一个附属 LIST 块对应于 00 号数据流;第二个附属 LIST 块对应于 01 号数据流......要想解释数据流, 我 们必须先了解 AVI 文件中数据块是什么。 AVI 文件中, 在 数据块是被放置在数据区中的一个有起始标志 (由 “数据流识别码”和“数据块存储方式识别码"组成,请参见对数据区部分的说明),并指明大小和数据内容 的数据段.那么,数据流就是那些相互之间具有联系的同种数据类型的数据块集合.

} aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息

00000000-00000003 多媒体文件识别码:RIFF 00000004-00000007 文件大小(10EDICh 字节)-8 字节 00000008-0000000B AVI 文件识别码 0000000C-0000000F 第一个 LIST 块识别码 00000010-00000013 第一个 LIST 块的大小(168h 字节) 00000014-00000017 hdrl 部分识别码,以下数据记录着此文件的格式 00000018-0000001B hdrl 部分所包含的 avih 块识别码,此模块记录着本文件的初始化信息 0000001C-0000001F avih 块大小(38h 字节) 00000020-00000023 每帧画面显示所维持多少个百万分之一秒,本例为 1046Bh,即 66667 百万分之一秒, 约 0.07 秒。所以在播放此文件时,你看到的画面约每秒 15 帧 AVI 视频文件 它的英文全称为 Audio Video Interleaved,即音频视频交错格式。是将语音和影像同步组合在一起的文 件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,因此尽管面面质量不是太好,但其应用 范围仍然非常广泛。AVI 支持 256 色和 RLE 压缩。AVI 信息主要应用在多媒体光盘上,用来保存电视、电影 等各种影像信息。 它于 1992 年被 Microsoft 公司推出, Windows3.1 一起被人们所认识和熟知。 “音 随 所谓 频视频交错”,就是可以将视频和音频交织在一起进行同步播放。这种视频格式的优点是图像质量好,可 以跨多个平台使用,其缺点是体积过于庞大,而且更加糟糕的是压缩标准不统一,最普遍的现象就是高版 本 Windows 媒体播放器播放不了采用早期编码编辑的 AVI 格式视频,而低版本 Windows 媒体播放器又播放 不了采用最新编码编辑的 AVI 格式视频,所以我们在进行一些 AVI 格式的视频播放时常会出现由于视频编 码问题而造成的视频不能播放或即使能够播放,但存在不能调节播放进度和播放时只有声音没有图像等一 些莫名其妙的问题,如果用户在进行 AVI 格式的视频播放时遇到了这些问题,可以通过下载相应的解码器 来解决。是目前视频文件的主流。 这种格式的文件随处可见,比如一些游戏、教育软件的片头,多媒体光 盘中,都会有不少的 AVI 。 现在,在 WINDOWS 95 或 98 里都能直接播放 AVI,而且它自己的格式也有好几种,最常见的有 Intel Inde o(R)Video R3.2、Microsoft video 等。 AVI 文件包含三部分:文件头、数据块和索引块。其中数据块包含实际数据流,即图像和声音序列数据。 这是文件的主体,也是决定文件容量的主要部分。视频文件的大小等于该文件的数据率乘以该视频播放的 时间长度,索引块包括数据块列表和它们在文件中的位置,以提供文件内数据随机存取能力。文件头包括 文件的通用信息,定义数据格式,所用的压缩算法等参数。 // AVIMAINHEADER flags public static readonly int AVIF_HASINDEX = 0x00000010; // Index at end of file? public static readonly int AVIF_MUSTUSEINDEX = 0x00000020; public static readonly int AVIF_ISINTERLEAVED = 0x00000100; public static readonly int AVIF_TRUSTCKTYPE = 0x00000800; // Use CKType to find key frames public static readonly int AVIF_WASCAPTUREFILE = 0x00010000; public static readonly int AVIF_COPYRIGHTED = 0x00020000; // AVISTREAMINFO flags public static readonly int AVISF_DISABLED = 0x00000001; public static readonly int AVISF_VIDEO_PALCHANGES = 0x00010000; // AVIOLDINDEXENTRY flags

public static readonly int AVIIF_LIST = 0x00000001; public static readonly int AVIIF_KEYFRAME = 0x00000010; public static readonly int AVIIF_NO_TIME = 0x00000100; public static readonly int AVIIF_COMPRESSOR = 0x0FFF0000; // unused? // TIMECODEDATA flags public static readonly int TIMECODE_SMPTE_BINARY_GROUP = 0x07; public static readonly int TIMECODE_SMPTE_COLOR_FRAME = 0x08;

// AVI stream FourCC codes public static readonly int streamtypeVIDEO = RiffParser.ToFourCC("vids"); public static readonly int streamtypeAUDIO = RiffParser.ToFourCC("auds"); public static readonly int streamtypeMIDI = RiffParser.ToFourCC("mids"); public static readonly int streamtypeTEXT = RiffParser.ToFourCC("txts"); // AVI section FourCC codes public static readonly int ckidMainAVIHeader = RiffParser.ToFourCC("avih"); public static readonly int ckidODML = RiffParser.ToFourCC("odml"); public static readonly int ckidAVIExtHeader = RiffParser.ToFourCC("dmlh"); public static readonly int ckidStreamList = RiffParser.ToFourCC("strl"); public static readonly int ckidAVIStreamHeader = RiffParser.ToFourCC("strh"); public static readonly int ckidStreamFormat = RiffParser.ToFourCC("strf"); public static readonly int ckidAVIOldIndex = RiffParser.ToFourCC("idx1");


相关文章:
AVI文件格式详解
AVI 格式 AVI 文件采用的是 RIFF 文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格 式)是微软公司定义的一种用于管理 windows 环境中多媒体数据...
封装格式详解-AVI篇
封装格式详解-AVI篇_计算机软件及应用_IT/计算机_专业资料。对媒体格式及编解码做讲解高清知识普及讲座 封装格式详解-AVI 篇更新日期:2008-03-14 来源:中关村在线 ...
用格式工厂将FLV转换成AVI视频格式的方法
格式工厂将 FLV 转换成 AVI 视频格式的方法 flv 是一种新兴主流的网络视频格式, 目前许多在线视频网站都采用此视频格式, AVI, 而 即音频视频交错格式,在部分...
avi格式详细介绍
格式详细介绍< avi 格式详细介绍<转> (2008-12-18 22:09:44) 标签:avi 音频 it 分类:研发杂物箱 AVI 格式是音频视频交错(Audio Video Interleaved)的英文...
将高清视频文件轻松转换成RMVB和AVI格式
将高清视频文件轻松转换成RMVB和AVI格式_计算机软件及应用_IT/计算机_专业资料。将高清视频文件轻松转换成 RMVB 和 AVI 格式城市越来越大了,上班、回家可能都要坐上...
AVI编辑 AVI格式一般指AVI
AVI编辑 AVI格式一般指AVI_电脑基础知识_IT/计算机_专业资料。avi格式详细解说,转载于网络AVI 编辑 AVI 格式一般指 AVI 本词条缺少信息栏,补充相关内容使词条更完整...
avi视频文件头十六进制码分析AVI格式
avi视频文件头十六进制码分析AVI格式_IT/计算机_专业资料。还不多的结合avi 视频文件头十六进制码分析 AVI 格式 这段时间要搞视频合成方面的东西, 因此打算先弄明...
exe转avi格式转换器完美教程
exe转avi格式转换器完美教程_计算机软件及应用_IT/计算机_专业资料。exe转avi格式转换器教程分享exe 是一种可在操作系统存储空间中浮动定位的可执行程序。比如我们下...
AVI格式电影收藏列表
AVI格式电影收藏列表_其它_总结/汇报_实用文档。AVI 格式电影收藏列表 DVD1 1.2012 (无字幕) 2.爱丽丝梦游仙境 DVD2 1.天下无双 2.情癫大圣 DVD3 1.走着瞧...
将Dat格式转化为AVI格式
将Dat格式转化为AVI格式_IT/计算机_专业资料。一、将 Dat 格式转化为 AVI 格式 大家都知道 VCD 中的视频文件格式大多数为.dat,但它偏偏不能被 PowerPoint 所识...
更多相关标签:
avi格式转换器 | avi格式用什么播放器 | avi | avi格式视频下载 | avi视频下载 | avi格式mv下载 | avi格式歌曲下载 | avi格式歌曲视频下载 |