mkvextract -- 將 Matroska(tm) 軌道檔案擷取至其他檔案

# 1. 概要

mkvextract {輸入檔名} {模式1} 選項 擷取規格1 模式2 選項 擷取規格2 …

# 2. 摘要說明

此程式從 Matroska(tm) 檔中提取特定部分到其他有用的格式。第一個參數是原始檔案的名稱，該檔必須是 Matroska(tm) 檔。

所有其他引數可切換至特定擷取模式，變更目前使用模式的選項，或指定要擷取那些內容至哪個檔案中。可在 mkvextract 同一次啟動中使用多個模式，允許一次擷取多個內容。大多數選項只能在特定模式下使用，只有少數選項適用於所有模式。

目前支援軌道 tracks 軌道, tags 標籤, attachments 附件, chapters 章節, CUE sheets CUE 工作表, timestamps 時間戳記 與 cues的擷取。

## 2.1. 一般選項

以下選項在所有模式下都可用，本節中僅介紹一次。

Option | Description
--- | ---
-f, --parse-fully | 將剖析模式設為 '完整' 。預設模式不會剖析完整檔案，而是使用變換定位元件尋找原始檔案所需的元件。在 99% 情形足以夠用。但對於不包含變換定位元件或受損的檔案來說，使用者很可能需要使用此模式。完整檔案掃描會耗費較久的時間，而快速掃描只需要幾秒鐘。
--command-line-charset 字元集 | 設定在命令列顯示的字串字元集，以轉換為其他字元集。預設為目前系統所在位置指定的字元集。
--output-charset 字元集 | 設定要轉換為輸出字串的字元集。預設為目前系統所在位置指定的字元集。
-r, --redirect-output 檔名 | 將所有訊息寫入到檔案 檔名 而不是命令列。儘管使用輸出重新導向可以輕鬆完成此操作，但在某些情況下需要使用此選項: 當終端在將輸出寫入文件之前重新解釋（覆蓋）輸出時。 優先使用通過 --output-charset 設定字元集。
--flush-on-close | 關閉已開啟寫入的檔案時，告訴程式清理所有在記憶體中的資料。這可以防止因斷電造成的資料遺失或避免作業系統或驅動程式造成的某些問題。缺點是執行合併工具會花費較久個時間，因為 mkvmerge 需要等待所有資料已寫入至儲存空間後，才會結束。請參閱 MKVToolNix 錯誤追蹤上的 #2469 和 #2480 問題，以便深入瞭解其優缺點。
--ui-language 語言碼 | 強制使用語言 編碼 對應的的翻譯(例如 'zh_TW' 為臺灣正體中文翻譯)。 在編碼欄位中輸入'list' 讓程式輸出時使用可用的對應翻譯清單。
--abort-on-warnings | 發出第一個警告後，終止程式。程式的結束碼為 1 。
--debug 主題 | 針對特定功能開啟除錯。此選項適用於開發者。
--engage 功能 | 開啟實驗中功能。 透過mkvextract --engage list啟用可用的列表。這些功能不會在正常情況下使用。
--gui-mode | 開啟 GUI 模式。在這種模式中，可能會輸出特殊格式的行數，可以呈現控制的 GUI 發生什麼事。這些訊息會以 '#GUI#訊息'呈現。訊息可能包含機碼/值，例如 '#GUI#訊息#機碼1=值1#機碼2=值2…'。 無論是訊息或是機碼都不會轉為譯文，而且永遠使用 *英語* 輸出。
-v, --verbose | 輸出時盡量詳細，並在讀取時顯示所有 Matroska(tm) 重要的元件。
-h, --help | 顯示使用方式並退出。
-V, --version | 顯示版本資訊並離開。
@options-file.json | 從檔案選項檔讀取其他命令列引數。有關此類檔案支援格式的完整說明，請參閱 mkvmerge(1) 文件中的 "選項檔案" 章節。

## 2.2. 軌道擷取模式

語法: mkvextract 原始檔名 tracks [選項] TID1:輸出檔名1 [TID2:輸出檔名2 ...]

以下命令列選項可用於 'tracks' 提取模式下的每個軌道。 這些命令須在應該所套用到的軌道指令（請見下文）前出現。

Option | Description
--- | ---
-c 字元集 | 設定字元集為下一個文字字幕軌道為該字元集。僅在下一個軌道 ID 對應文字字幕軌道時有效。預設為 UTF-8 。
--blockadd 層級 | 僅將 BlockAdditions 保留在此層級。預設為保留所有層級。此選項僅影響某些類型的編碼，例如 WAVPACK4 。
--cuesheet | 導致 mkvextract(1) 從章節資訊中擷取 CUE 工作表，並將該軌道的資料標記到由輸出軌道名稱命名並以 '.cue' 為格式的檔案中。
--raw | 將原始資料擷取到原始檔案裡，但不包含其他容器資料。與 --fullraw 標籤不同，此標籤不會導致 CodecPrivate 元件的內容寫入檔案。此模式適用於所有的 CodecIDs ，縱使 mkvextract(1) 不支援，可能也會產生無法使用的檔案。
--fullraw | 將原始資料擷取到原始檔案裡，但不包含其他容器資料。如果軌道包含表頭元件，那麼 CodecPrivate 元件將寫入檔案中。此模式適用於所有的 CodecIDs，縱使 mkvextract(1) 不支援，可能也會產生無法使用的檔案。
TID:輸出檔名 | 如果原始檔案中存在 ID 為 TID 的軌道，會將擷取為 輸出檔名 。此選項可多次使用。軌道 ID 與 mkvmerge(1) 的 --identify 選項輸出的相同。 每個輸出名稱只能使用一次，但 RealAudio 與 RealVideo 軌道除外。如果將不同的軌道使用相同的名稱，那麼會儲存到同一個檔案。例如:
    $ mkvextract input.mkv tracks 0:video.h264 2:output-two-vobsub-tracks.idx 3:output-two-vobsub-tracks.idx

## 2.3. 附件擷取模式

語法: mkvextract 原始檔名 attachments [選項] AID1:輸出檔名1 [AID2:輸出檔名2 ...]

Option | Description
--- | ---
AID:輸出檔名 | 如果原始檔案中存在 ID 為 AID 的附件軌道，會將擷取為 輸出檔名 。假設 輸出檔名 保留空白，那麼將會使用原始 Matroska(tm) 檔案中的附件名稱。此選項可多次使用。此選項可多次使用。附件 ID 與 mkvmerge(1) 的 --identify 選項輸出的相同。

## 2.4. 章節擷取模式

語法: mkvextract 原始檔名 chapters [選項] 輸出檔名.xml

Option | Description
--- | ---
-s, --simple | 用 OGM 工具的簡易格式來匯出章節資訊 (CHAPTER01=..., CHAPTER01NAME=…)。 在此模式中，將會丟棄部分資訊。預設是以 XML 格式輸出章節。
--simple-language 語言 | 如果啟用簡易模式， mkvextract(1) 即使單一章節單元包含一個以上的章節名稱，每個章節單元只會輸出單一項目。在預設情況下，無論任何語言， mkvextract(1) 都將會使用找到的第一個名稱。 使用此選項，當單元包含一個以上章節名稱時，允許使用者決定使用哪一個章節名稱作為輸出使用。 語言 參數必須為 ISO 639-1 或 ISO 639-2 編碼。

章節將寫入指定輸出檔案。預設情況下，會使用 mkvmerge(1) 可識別的 XML 格式。如果檔案中沒有找到任何章節，將不會建立輸出檔案。

## 2.5. 標籤擷取模式

語法: mkvextract 原始檔名 tags [選項] 輸出檔名.xml

標籤將寫入指定輸出檔案。預設情況下，會使用 mkvmerge(1) 可識別的 XML 格式。如果檔案中沒有找到任何標籤，將不會建立輸出檔案。

## 2.6. Cue 工作表擷取模式

語法: mkvextract 原始檔名 cuesheet [選項] 輸出檔名.cue

CUE 表單將寫入指定輸出檔案。如果檔案中沒有找到任何章節或標籤，將不會建立輸出檔案。

## 2.7. 時間戳記擷取模式

語法: mkvextract 原始檔名 timestamps_v2 [選項] TID1:輸出檔名1 [TID2:輸出檔名2 ...]

Option | Description
--- | ---
TID:輸出檔名 | 如果原始檔案中存在 ID 為 TID 的時間戳記軌道，會將擷取為 輸出檔名 。此選項可多次使用。此選項可多次使用。軌道 ID 與 mkvmerge(1) 的 --identify 選項輸出的相同。 範例:
    $ mkvextract input.mkv timestamps_v2 1:ts-track1.txt 2:ts-track2.txt

## 2.8. Cue 擷取模式

語法: mkvextract 原始檔名 cues [選項] TID1:輸出檔名1 [TID2:輸出檔名2 ...]

Option | Description
--- | ---
TID:輸出檔名 | 如果原始檔案中存在 ID 為 TID 的 CUE 軌道，會將擷取為 輸出檔名 。此選項可多次使用。此選項可多次使用。附件 ID 與 mkvmerge(1) 的 --identify 選項輸出的相同，且不會包含 CueTrack 元件的數字。

輸出的格式為簡易文字格式: 每行對應一組 CuePoint 元件與 機碼=值。當選用的元素不存在於 CuePoint 時(例如 CueDuration) ，將會以短破折號(虛線)作為輸出值。

範例:

    timestamp=00:00:13.305000000 duration=- cluster_position=757741 relative_position=11

可使用的機碼如下:

Option | Description
--- | ---
timestamp | CUE 點的時間戳記( timestamp)具有奈秒的精準度。格式為 HH:MM:SS.nnnnnnnnn。 此元件為必要設定。
duration | CUE 點的時間長度(duration)具有奈秒的精準度。格式為 HH:MM:SS.nnnnnnnnn。
cluster_position | 包含引用元件的叢集起始的 Matroska(tm) 檔案內位元組的絕對位置。 Note: Matroska(tm) 檔案中的 CueClusterPosition 相對於剪輯資訊資料的起始偏移。但由 mkvextract(1) CUE 擷取模式輸出的值已經包含該偏移，並且是與文件開頭的絕對偏移。
relative_position | CUE 點引用的 BlockGroup 或 SimpleBlock 元件在叢集起始內以位元組為單位的相對位置。 Note: Matroska(tm) 檔案中的 CueRelativePosition 是相對於叢集資料起始的偏移。但 mkvextract(1) 的 CUE 擷取模式所輸出的值，是相對於叢集的 ID 。可通過新增與新增檔案計算檔案內的 cluster_position 和 relative_position。

範例:

    $ mkvextract input.mkv cues 1:cues-track1.txt 2:cues-track2.txt

# 3. 範例

同時擷取章節與標籤並依照各自的 XML 格式儲存:

    $ mkvextract movie.mkv chapters movie-chapters.xml tags movie-tags.xml

同時擷取數個軌道與各自對應的時間戳記:

    $ mkvextract "Another Movie.mkv" tracks 0:video.h265 "1:main audio.aac" "2:director's comments.aac" timestamps_v2 "0:timestamps video.txt" "1:timestamps main audio.txt" "2:timestamps director's comments.txt"

擷取 Ogg/OGM 格式的章節，然後將文字字幕軌道重新編碼到另一個字元集:

    $ mkvextract "My Movie.mkv" chapters --simple "My Chapters.txt" tracks -c MS-ANSI "2:My Subtitles.srt"

# 4. 文字檔案與字元集轉換

关于 MKVToolNix 套件中所有工具如何处理字符集转换、输入/输出编码、命令行编码及控制台编码的深入讨论，请参见 mkvmerge(1) 手册中相对应名称的段落。

# 5. 檔案輸出格式

输出的格式取决于轨道的类型，而不是输出文件名的扩展名。目前支持以下轨道类型:

Option | Description
--- | ---
A_AAC/MPEG2/*, A_AAC/MPEG4/*, A_AAC | 所有 AAC 文件将被输出为 AAC 文件，其中数据包前有 ADTS 头。ADTS 头将不含反增强字段（deprecated emphasis field）。
A_AC3, A_EAC3 | 這將會擷取為 raw AC-3 檔案。
A_ALAC | ALAC 軌道將寫入成 CAF 檔案。
A_DTS | 這將會擷取為 raw DTS 檔案。
A_FLAC | FLAC 軌道將寫入成原始 FLAC 檔案。
A_MPEG/L2 | MPEG-1 音層 II 串流將會擷取為原始的 MP2 檔案。
A_MPEG/L3 | 這將會擷取為 raw MP3 檔案。
A_OPUS | Opus(tm) 軌道將寫入成 OggOpus(tm) 檔案。
A_PCM/INT/LIT, A_PCM/INT/BIG | 原始 PCM 数据将写入 WAV 文件。大端序整数数据在此期间将被转为小端序数据。
A_REAL/* | RealAudio(tm) 軌道將寫入成 RealMedia(tm) 檔案。
A_TRUEHD, A_MLP | 這將會擷取為 raw TrueHD/MLP 檔案。
A_TTA1 | TrueAudio(tm) 轨道将被输出为 TTA 文件。请注意，由于 Matroska(tm) 时间戳的精度限制，解开来的文件的头部有两个字段不同：data_length (文件的总采样数) 与 CRC。
A_VORBIS | Vorbis 音訊將會以 OggVorbis(tm) 寫入檔案。
A_WAVPACK4 | WavPack(tm) 軌道將寫入成 WV 檔案。
S_HDMV/PGS | PGS 字幕將會以 SUP 寫入檔案。
S_HDMV/TEXTST | TextST 字幕将以转为 mkvmerge(1) 与 mkvextract(1) 发明的特殊格式写入。
S_KATE | Kate(tm) 流将以 Ogg(tm) 为容器输出。
S_TEXT/SSA, S_TEXT/ASS, S_SSA, S_ASS | SSA 與 ASS 純文字字幕將會分別以 SSA/ASS 寫入檔案。
S_TEXT/UTF8, S_TEXT/ASCII | 簡易純文字字幕將會以 SRT 寫入檔案。
S_VOBSUB | VobSub(tm) 字幕将输出为 SUB 文件及相应的索引文件（后缀为 IDX）。
S_TEXT/USF | USF 純文字字幕將會以 USF 寫入檔案。
S_TEXT/WEBVTT | WebVTT 純文字字幕將會以 WebVTT 寫入檔案。
V_MPEG1, V_MPEG2 | MPEG-1 与 MPEG-2 视频轨道将输出为 MPEG 基本流（ES）。
V_MPEG4/ISO/AVC | H.264 / AVC 视频轨将被输出为 H.264 基本流，可以使用如 GPAC(tm) 工具包中的 MP4Box(tm) 作进一步处理。
V_MPEG4/ISO/HEVC | H.265 / HEVC 视频轨道将输出为 H.265 基本流（ES），该格式可使用 GPAC(tm) 软件包中的 MP4Box(tm) 作进一步处理。
V_MS/VFW/FOURCC | 使用此 CodecID 且 FPS 恒定的视频轨将被输出为 AVI 文件。
V_REAL/* | RealVideo(tm) 軌道將寫入成 RealMedia(tm) 檔案。
V_THEORA | Theora(tm) 流将以 Ogg(tm) 为容器输出
V_VP8, V_VP9 | VP8 / VP9 軌道將寫入成 IVF 檔案。
標籤 | 标签将被转换为 XML 格式。此格式与 mkvmerge(1) 所支持读取的标签格式相同。
附件 | 附件将被以原样输出。不会进行任何转换。
章節 | 章节将被转换为 XML 格式。此格式与 mkvmerge(1) 所支持读取的章节格式相同。您也可以选择输出精简的简单 OGM 格式。
Timestamps | 时间戳会先被排序，然后以 timestamp v2 格式文件输出，该文件适用于 mkvmerge(1)。不支持提取为其他格式 (v1, v3 或 v4)。

# 6. 結束代碼

使用三個之一的結束代碼結束 mkvextract(1) ：

- 0 -- 此結束代碼表示擷取已成功完成。

- 1 -- 在此情況下， mkvextract(1) 輸出時至少有一則警告，但擷取動作仍然進行。警告訊息會在前端出現 '警告:'字樣。依據問題的程度，生成的檔案也許可用。建議使用者檢視警告訊息與輸出檔。

- 2 -- 此結束代碼用於發生錯誤後。mkvextract(1) 在輸出錯誤訊息後立即中止動作。錯誤訊息的範圍包含從錯誤命令列參數的讀/寫至檔案損壞。

# 7. 環境變數

mkvextract(1) 使用決定系統的地區設定的變數 (例如： LANG 與 LC_* 系列)。 附加變數：

Option | Description
--- | ---
MKVEXTRACT_DEBUG, MKVTOOLNIX_DEBUG 與其縮寫 MTX_DEBUG | 視為通過 --debug 選項傳遞的內容。
MKVEXTRACT_ENGAGE, MKVTOOLNIX_ENGAGE 與其縮寫 MTX_ENGAGE | 視為通過 --engage 選項傳遞的內容。

# 8. 參閱

mkvmerge(1), mkvinfo(1), mkvpropedit(1), mkvtoolnix-gui(1)

# 9. 網路

永遠可在 MKVToolNix 首頁 找到最新版。