首页资源分类嵌入式系统 > 视频文件结构分析

视频文件结构分析

已有 445117个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:AVI

    分    享:

    文档简介

    AVI视频文件结构分析

    文档预览

    第 27 卷第 3 期 第V2o7l.2卷7 第N3o期.3 企业技术开发 TECHNOLOGICAL DEVELOPMENT OF ENTERPRISE 2008 年 3 月 Mar.2008 AVI 文件结构的实例分析 黄东军, 贺宏遵 ( 中南大学 信息科学与工程学院, 湖南 长沙 410083) 摘 要 : AVI 文 件 是 研 究 视 频 技 术 的 重 要 工 具 。 正 确 理 解 AVI 文 件 结 构 并 掌 握 AVI 图 像 数 据 操 作 , 是 实 现 各 种 基 于 AVI 文 件 的 视 频 处 理 的 必 要 条 件 。文 章 结 合 一 个 具 体 AVI 文 件 的 debug 分 析 , 展 示 了 详 尽 而 具 体 的 AVI 文 件 内 容, 这项研究对希望深入了解视频图像处理技术的人员有较大参考价值。 关 键 词 : AVI 文 件 ; 格 式 分 析 ; 数 据 操 作 中 图 分 类 号 : TP37 文献标识码: A 文 章 编 号 : 1006- 8937( 2008) 03- 0003- 04 Resear ch on oper ating the image pixels of AVI file thr ough specific example HUANG Dong- jun, HE Hong- zun (College of Information Science and Engineering, Central South University, Changsha, Hunan 410083, China) Abstr act:AVI is one of the most important format of video files which can be widely used by various researchers of video techniques. Understanding the format and knowing how to use an AVI file is necessary for any one who pursues video techniques. This paper shows the format of an AVI file in detail by a specific example. Finally, a general description is given. We believe that many learners can benefit from this study. Keywor ds: AVI file; format analysis; data operation AVI( Audio Video Interleaved) 是 Windows 操 作系统上最基本、最常用的一种视频格式文件, 多 用 于 音 视 频 捕 捉 、编 辑 、回 放 等 应 用 程 序 中 。由 于 声 音和图像数据在 AVI 文件中通常是未经压缩的, 因 此人们可以方便地操作这些数据, 例如对图像数据 实 施 二 值 化 、淡 入 、淡 出 、缩 放 等 各 种 处 理 , 所 以 AVI 文件是我们研究视频技术的重要工具[1]。 已经有不少文章讨论 AVI 文件的格式分析、播 放程序设计、AVI 文件分解与合并等, 但是这些文 章多半是英文版 AVI 规范的翻译, 对程序设计方法 也 多 为 抽 象 说 明[2- 3]。 正 确 理 解 AVI 文 件 结 构 并 掌 握图像数据操作, 是完成各种基于 AVI 的视频开发 的必备条件。本文结合一个具体 AVI 文件的 debug 分析, 展示了详尽而具体的 AVI 文件内容。通过示 例 , 读 者 容 易 建 立 对 AVI 文 件 的 直 观 印 象 , 然 后 再 用一般结构进行归纳, 一个完整而形象的认识就建 立起来了。因此, 本文的工作对希望深入了解 AVI 视频图像处理技术的人有较大参考价值。 1 AVI 文件格式的实例分析 通常情况下, 一个 AVI 文件可以包含多个不同 类型的媒体流( 典型的情况下有一个音频流和一个 视频流) , 含有单一音频流或单一视频流的 AVI 文 件也是合法的。为简明起见, 本文拟集中研究仅含 图像序列的 AVI 文件。 AVI 文 件 是 一 种 RIFF ( Resource Interchange File Format, 资源交换文件格式) 格 式 文 件 。 RIFF 文件使用四字符码 FOURCC ( four- character code) 来 表 征 数 据 类 型 , 比 如 用“RIFF”表 示 格 式 类 型 , 用 “AVI”表示具体的文件类型, 用“LIST”表示列表等。 “AVI”四字符码中含有空格, 这也是合法的。 RIFF 文件首先含有一 个 如 图 1 所 示 的 文 件 头 结构。 收稿日期: 2007- 12- 07 作者简介: 黄 东 军( 1966 —) , 男 , 湖 南 常 德 人 , 博 士 研 究 生 , 教 授 , 主 要 研 究 方 向:网 络 与 多 媒 体 技 术 。 图 1 RI FF 文 件 结 构 图 2 是 用 debug 程 序 打 开 AVI 文 件 后 所 显 示 的文件最开始部分的十六进制数据。可以看出前 4 4 企业技术开发 2008 年 3 月 个 字 符 为 RIFF, 随 后 是 文 件 大 小( F0 D2 01 00) 。 这 个 数 的 二 进 制 表 示 应 当 是 这 样 的 : 00000000 00000001 11010010 11110000, 即 0x00 到 了 前 面 , 而 0xF0 则放在了最后, 这样才能正确换算为十进 制数。文件大小后面又是一个四字符码, 描述文件 的具体类型( 比如 AVI、WAVE 等) , 这里是“AVI ”, AVI 后面有一个空格。 图 2 用 debug 程 序 打 开 AVI 文 件 后 所 显 示 的 文 件 最开始部分的十六进制数据 RIFF 文 件 的 数 据 从 LIST 开 始 。 为 直 观 起 见 , 下面按顺序依次说明各个部分的格式。 在 图 2 中 , 我 们 可 以 看 到“LIST”四 个 字 符 , 其 后 为 LIST 的 大 小 , 是 0xC4040000; 接 着 是“hdrl”, 表 示 下 面 是 头 部 列 表 的 数 据 ; 然 后 是“avih”, 表 示 AVI 头 部 ; 接 着 是 AVI 头 部 的 大 小 : 0x38000000。 AVI 头部大小的后面跟的是什么? 在图 2 中不容易 看出来, 实际上是一个如下的数据结构: typedef struct { DWORD dwMicroSecPerFrame; //显 示 每 桢 所 需的时间 ns, 定义 avi 的显示速率 DWORD dwMaxBytesPerSec; //最 大 的 数 据 传 输率 DWORD dwPaddingGranularity; //记 录 块 的 长 度需为此值的倍数, 通常是 2048 DWORD dwFlages; //AVI 文件的特殊属性, 如 是否包含索引块, 音视频数据是否交叉存储 DWORD dwTotalFrame; //文件中的总桢数 DWORD dwInitialFrames; //说 明 在 开 始 播 放 前需要多少桢 DWORD dwStreams; //文 件 中 包 含 的 数 据 流 种 类 DWORD dwSuggestedBufferSize; //建 议 使 用 的 缓冲区的大小, //通 常 为 存 储 一 桢 图 像 以 及 同 步 声 音 所 需 要 的数据之和 WORD dwWidth; //图像宽 DWORD dwHeight; //图像高 DWORD dwReserved[4]; //保留值 }MainAVIHeader; 这个数据结构占据 56 个字节, 正是图 2 中从 k 开始到第二个 LIST 前的这一段。这个数据结构告 诉我们很多关于这个 AVI 文件的信息, 如显示速率 等, 这就为打开该 AVI 文件的程序提供了 播放根据。 MainAVIHeader structure 后 面 是 所 谓 的 AVI 流头部列表, 也是以“LIST”开始, 接 着 是 这 个 LIST 的 大 小 : 0x78040000; 然 后 是“strl”, 表示这个列 表 的 数 据 是 流 列 表 类 型。之后紧跟着的是“strh”块, 表示流头部, 后面是这个流头部的大小: 0x38000000。接 着是什么? 是和“LIST”类似的标识符“vids” 吗? 不是。跟在流头部大小后面的又是一个 如下的数据结构: typedef struct { FOURCC fccType; //4 字节, 表示数据流的种 类 vids 表示视频数据流 //auds 音频数据流 FOURCC fccHandler; //4 字 节 , 表 示 数 据 流 解 压缩的驱动程序代号 DWORD dwFlags; //数据流属性 WORD wPriority; //此数据流的播放优先级 WORD wLanguage; //音频的语言代号 DWORD dwInitalFrames; //说明在开始播放前 需要多少桢 DWORD dwScale; //数 据 量 , 视 频 每 桢 的 大 小 或者音频的采样大小 DWORD dwRate; //dwScale /dwRate=每 秒 的 采样数 DWORD dwStart; //数 据 流 开 始 播 放 的 位 置 , 以 dwScale 为单位 DWORD dwLength; //数 据 流 的 数 据 量 , 以 dwScale 为单位 DWORD dwSuggestedBufferSize; //建 议 缓 冲 区 的大小 DWORD dwQuality; //解压缩质量参数, 值越 大, 质量越好 DWORD dwSampleSize; //音频的采样大小 RECT rcFrame; //视频图像所占的矩形 第 27 卷第 3 期 黄东军,等:AVI 文件结构的实例分析 5 }AVIStreamHeader; 显 然 , 这 是 AVI 流 头 部 结 构 , 它 描 述 了 这 个 流 的类型、压缩方式等属性。这个结构也占据 56 字 节 , 从“vids”到“strf”之 前 。 现 在 来 看 看“vids”是 什 么 。 原 来 它 是 AVI 流 头 部 结 构 内 部 的 一 个 四 字 符 码, 表示这个流是视频数据, 不是音频数据。“vids” 后 面 是“DIB ”, 注 意 后 面 有 一 个 空 格 ; 它 表 示 这 个 视频流的图像是没有压缩的 DIB 位图, 即设备无关 位图。 AVI 流 头 部 结 构 后 面 是 流 格 式 块 , 以 “ strf”标 识 。“ strf”标 识 后 是 这 个 块 的 大 小 : 0x2C040000。接着是BITMAPINFO 结构: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; //颜色表 }BITMAPINFO; 其 中 的 BITMAPINFOHEADER 是 位 图 信 息 头 结构, 如下所示: typedef struct tagBITMAPINFOHEADER { DWORD biSize; //位图信息头结构的大小 LONG biWidth; //图像宽度 LONG biHeight; //图像高度 WORD biPlanes; //目标设备位面数, 设为 1 WORD biBitCount; //单位像素的位数, 即图像 的位深度 DWORD biCompression; //图像的压缩类型 DWORD biSizeImage; //图 像 的 大 小 , 以 字 节 为单位 LONG biXPelsPerMeter; //水 平 方 向 每米像素数 LONG biYPelsPerMeter; //垂 直 方 向 每米像素数 DWORD biClrUsed; //实 际 使 用 的 色 彩表中的颜色索引数 DWORD biClrImportant; //重 要 颜 色 数 }BITMAPINFOHEADER; 位 图 信 息 头 结 构 的 大 小 是 40( 字 节) , 这 正 是 0x28000000 换算的十进制数。接着, 我们看到了图 像的宽度和高度( 本例是 80×48) 。现在让我们仔细 看一下该 AVI 文件的图像位深度: 由于位图信息头 结 构 的 大 小 、图 像 宽 度 、图 像 高 度 占 12 个 字 节 , 加 上目标设备位面数占两个字节( 0x0100) , 因此位深 度是 0x1800 ( 占两个字节) , 稍加换算即可知道为 24。这表明图像是 24 位的, 是典型的 RGB 彩色模 型位图。 虽然位图信息头结构的大小是 40 字节, 但是 整 个“strf”块 的 大 小 是 0x2C040000, 即 1 068 个 字 节, 这中间大部分是颜色表。 颜色表后面是“JUNK”四字符码, 如图 3 所示, 图 3 J UNK列 表 这是 JUNK 列表。 JUNK 列 表 在 一 般 的 AVI 格 式 分 析 中 都 没 有 介 绍[4], 但 是 现 在 我 们 遇 到 了 。 这 说 明 AVI 文 件 的 格式很灵活。实际上 JUNK 列表中的数据均为零, 这从图 3 看得很清楚。JUNK 列表起占位作用, 用户 可以在其中写入各种信息( 所以并非垃圾块) 。从图 3 还可以看出, JUNK 列表的大小是 0x140B0000, 即 3 904 个字节。 越过 JUNK 列表, 就是最重要的图像数据本身 了, 如图 4 所示。图像数据是一个列表, 所以用“LIST” 开始, 后面是这个 LIST 的大小, 为 0x54C20100, 即 115 284 字节, 可见这是整个 AVI 文件的主体。LIST 大小后面是“movi”四字符码, 表示视频块的开始。 图 4 图像数据列表 视频图像序列到底如何排列呢? 原来, 图像数 据 列 表 中 包 含 着 以 帧 为 单 位 的 视 频 序 列 图 像 块 。每 一块( 也就是一帧) 以“00db”开始, 接着是块大小, 这 里是 0x002D0000, 即 11 520 字节, 这正是 80×48×3 的计算结果。所以, 后面的每一帧都是以“00db”开 始的块。了解这一点很重要, 程序在读取一帧图像 6 企业技术开发 2008 年 3 月 数据时必须越过这 8 个字节。 至 此 , 我 们 通 过 一 个 特 例 , 对 AVI 文 件 的 结 构 按照存储顺序作了说明。有了这样一个直观认识, 再来看 AVI 规范的描述就比较容易理解了。 2 AVI 文件的一般结构 图5 是 AVI 文件格式的一般描述。结合前面的 示例 , 可以看 出 : 整 个 AVI 文 件 在 逻 辑 上 由 文 件 头 和数据( data) 构 成 。 而 数 据 是 指 文 件 包 含 的 列 表 , 如 header list、info list、movi list、indx list 等。列表 又 可 以 包 含 子 列 表 和 块 , 如 stream header list 列 表、AVI header 块等。这里, 已经不难理解什么是列 表、什么是块了。显然, 列表是含有子列表和块的数 据类型, 而块则是基本的数据类型。总之, 一个 AVI 文件就是通过列表和块来组织数据的。 本 文 虽 然 以 一 个 仅 包 含 视 频 数 据 的 AVI 文 件 来说明文件结构, 但是已经不难理解含有音频序列 的 AVI 文件了。图 5 中, stream header list 1 后面 可 以 再 跟 一 个 stream header list 2, 这 个 子 列 表 就 是用来描述音频流的, 与视频流的描述类似, 音频 流 列 表 中 含 有 波 形 声 音 数 据 结 构 WAVEFORMA- TEX structure, 它描述 了 波 形 音 频 的 特 征 。 如 果 一 个 AVI 文件同时含有音频和视频序列, 那么在后面 的 Movie list 中, 就会交错地摆放音频帧与视频帧。 而 一 个 音 频 帧 就 是 以“ 00wb ”四 字 符 码 开 始 的 。 由于 AVI 文件格式具有很大的灵活性, 因此有 时候一个具体的 AVI 文件还可能包含信息列表、索 引列表, 甚至 JUNK 列表。 3 结语 AVI 是目前最为复杂的 RIFF 文件, 理解它 的前提条件还包括 : 熟 练 掌 握 DIB 图 像 的 相 关 数据结构和图像的实际存储结构 ( 包括压缩和 非压缩两种情形) 、波形音频的相关数据结构和 存储结构。掌握了 AVI 文件结构, 再 辅 以 相 关 知识, 就能顺利操作视频和音频数据了[5- 6]。 参考文献: [1] 黄 晓 鹰.Visual C++6.0 显 示 AVI 文 件 的 研 究[J].光 电 工 程 , 2003,( 3) : 26. [2] 谢 维 , 李 华 . 视 频 文 件 格 式 及 转 换 [J]. 电 子 与 电 脑 , 2002,( 5) : 12- 16. [3] 冯传岗.当代视频文件格式之纵观[J].现代电视技术, 2005,( 2) : 21- 25. [4] 吕 四 化 , 史 萍 .视 频 文 件 格 式 研 究 [J].北 京 广 播 学 院 学 报( 自 然 科 学 版) , 2004,( 4) : 11- 17. [5] 周 俊.谈 谈 AVI 文 件 的 修 复 [J]. 电 脑 知 识 与 技 术( 经 验 技 巧) , 2003,( 1) : 8- 11. [6] 许 先 斌 , 朱 平 , 安 晖.扩 展 格 式 AVI 文 件 播 放 的 编 程 方 法[J]. 计 算 机 工 程 与 设 计 , 2003,( 3) : 65- 68. 图 5 AVI 文 件 的 一 般 结 构 《企业技术开发》投稿邮箱: hnqy@hnst.gov.cn

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。