跳转到内容

DVD-Video/IFO 文件内部

来自维基教科书,开放的书籍,为开放的世界
DVD-Video 内部
 ← MPEG 格式 IFO 文件 字幕流 → 

IFO(“信息”)文件在原始 MPEG 数据上施加结构。VMG 有一个 IFO 文件,每个 VTS 中也有一个。两种类型的 IFO 文件(VMG 与 VTS)具有共同的初始结构,但在后面的部分有所不同。

(目前请查看这里的图表)

这里保留了指向标题、章节等的各种指针表。这里还总结了视频、音频和字幕流的属性。其中一些(例如音频格式)是冗余的,可以通过扫描实际的 MPEG 数据获得(尽管在播放器初始化时在这里提供可能更方便),而其他信息,特别是语言代码分配,对于让用户配置标题播放很重要。此信息不包含实际的流 ID;这些可以在每个 PGC(如下)中找到。

节目链 (PGC)

[编辑 | 编辑源代码]

(目前请查看这里的图表)

每个 PGC 在 IFO 文件中都有一个条目。PGC 的 VM 命令和颜色表保存在这里,以及指向在 VOB 文件中查找相应 MPEG 数据的指针。

请注意,PGC 颜色表使用Y,Cr,Cb 格式定义颜色,没有透明度分量。相反,透明度(DVD-Video 称为对比度)在字幕流中引用颜色或在菜单按钮定义中指定。

这里还将找到流控制信息,8 个音频流条目和 32 个字幕流条目。这些按顺序对应于 IFO 早期部分中的音频和字幕属性条目。它们定义了此 PGC 中 MPEG 数据中与这些流相对应的特定流号。请注意,每个字幕流控制条目都有空间容纳 4 个不同的流号,分别是窄屏电视上的窄屏素材、宽屏电视上的宽屏素材或窄屏电视上的宽屏素材,采用信箱或全景模式。

能够在不同的 PGC 中具有对应流的不同流 ID,可能是为了更轻松地创作光盘,通过能够将来自不同来源的预先存在的素材组合在一起,而无需重新处理所有素材以分配一致的流 ID。“SCR 不连续性”标志,每个单元格都有,似乎也是此目的的一部分:它警告播放器关于时钟时间戳的不连续性,从而为创作系统节省了重新处理 MPEG 数据以分配一致时间戳的麻烦。

PGC 内部的单元格和节目

[编辑 | 编辑源代码]

单元格位置信息表显式列出了构成此 PGC 的所有单元格。这些单元格不需要按顺序出现在 MPEG 数据中,并且可以多次引用相同的单元格。这允许以多种不同方式呈现相同的素材,而无需使用交互机器对显式单元格级别排序进行复杂编程。

节目映射条目表定义了 PGC 中单元格到节目的分组。每个条目指定单元格位置信息表的起始索引,并指定包含从该点开始的表中列出的所有单元格,直到下一个节目的开始。

[编辑 | 编辑源代码]

VMG 和 VTS IFO 标头都包含列出所有菜单的部分。这些按语言单元分组,每个语言单元由 ISO639 语言代码标识。在每个语言单元内可以有一个或多个菜单,每个菜单可以包含一个或多个 PGC。但是,不清楚这些语言单元是否起到了除了信息目的以外的任何作用,因为所有菜单的选择都是通过显式执行 VM 指令完成的。

标题映射

[编辑 | 编辑源代码]

VMG IFO 包含一个附加部分,为每个标题集中的每个标题分配一个顺序索引。这用于 VM 中的跨域跳转指令:你不能说“跳转标题集m 标题n”,而必须说“跳转标题i”,其中i 是此表的索引,它列出了mn

每个单元格由一个 16 位“VOB ID”与该 VOB 内的 8 位“单元格 ID”连接而成。此“VOB”与输出 DVD-Video 文件结构中对多个 .VOB 文件的分段无关;它可能对应于用于创作结构的输入 MPEG 源文件,每个输入文件都从 1 开始分配一个增量 VOB ID。因此,如果输入源 MPEG 文件小于 524272 个扇区,则下一个输入源文件将连接到同一个输出 .VOB 文件,但 VOB ID 将增加。

但这真的重要吗?播放器不在乎输入源文件是如何划分的。

VMGM_C_ADT, VTSM_C_ADT, VTS_C_ADT

[编辑 | 编辑源代码]

这些xxx_C_ADT 表按 VOBU 号索引,并返回有关 VOBU 属于哪个单元格的信息。这些表定义了单元格。

VMGM_VOBU_ADMAP, VTSM_VOBU_ADMAP, VTS_VOBU_ADMAP

[编辑 | 编辑源代码]

这些xxx_VOBU_ADMAP 表按 VOBU 号索引,并返回 VOBU 相对于包含 VOB 的起始扇区的起始扇区。

VOB 的位置

[编辑 | 编辑源代码]

上面的xxx_C_ADT 和xxx_VOBU_ADMAP 表都通过包含 VOB 内的扇区号来定位事物(单元格、VOBU)。但没有关于 VOB 本身从何处开始的表。(记住,VOB 与 DVD-Video 目录结构中划分成 .VOB 文件无关。)那么你如何找到 VOB?

在我看来,播放器必须按照如下方式推断这些信息

  • 第一个 VOB 从第一个 .VOB 文件的开头开始。由此,你可以确定第一个 VOB 内每个单元格和 VOBU 的起始位置。
  • 通过检查xxx_C_ADT 表,你可以推断出每个 VOB 内的最高单元格号。这将给你第一个 VOB 内的最高扇区号。
  • 因此,下一个扇区必须是第二个 VOB 的起始位置。对该 VOB 重新执行从上一步开始的操作,可以计算出它的最高扇区号。

依此类推,直到你将所有 VOB 都映射出来。

华夏公益教科书