跳轉到內容

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 都映射出來。

華夏公益教科書