如何使用 GroupDocs.Metadata 於 Java 提取 MKV 元資料

在本完整指南中,您將學習 如何使用 Java 提取 MKV 元資料,透過 GroupDocs.Metadata 函式庫。無論您是建立媒體目錄、驗證編碼參數,或自動產生縮圖,程式化讀取 Matroska(MKV)元資料都能節省大量人工時間。我們將說明原因、前置條件、具體設定步驟,以及展示 EBML 標頭、段落資訊、標籤與軌道資料的詳細程式碼片段。

快速回答

  • 「read mkv metadata java」是什麼意思? 它是使用 Java 程式化提取 Matroska 容器的元資料(標題、編解碼器、時長等)自 MKV 檔案。
  • 我應該使用哪個函式庫? GroupDocs.Metadata for Java 提供完整功能、高效能的 API,支援 Matroska 及超過 50 種其他格式。
  • 我需要授權嗎? 免費試用可用於評估;商業授權會移除所有試用限制。
  • 我可以讀取其他格式嗎? 可以——相同的 API 可讀取 MP4、AVI、MOV、MP3 以及更多容器。
  • 執行時需要網路連線嗎? 不需要——在 JAR 放入 classpath 後,所有提取皆在本機完成。
  • 我能處理多大的檔案? 函式庫以串流方式處理容器,讓您可處理高達 10 GB 的檔案,同時堆疊使用量保持在 200 MB 以下。

什麼是 Matroska (MKV) 元資料?

Matroska (MKV) 元資料是儲存在 MKV 容器內的一組描述性與結構性資訊,例如標題、編解碼器、時長與軌道細節。存取這些資料可讓您建立可搜尋的目錄、驗證檔案完整性,或驅動自動化工作流程(如縮圖產生)。

為什麼要在 Java 中讀取 MKV 元資料?

在 Java 中讀取 MKV 元資料可讓您自動化目錄編製、驗證編解碼器與語言需求,並在不需手動檢查的情況下提取關鍵屬性,從而節省時間並降低錯誤。它亦提供唯一的真實資料來源,方便建立可搜尋的資料庫或供給下游轉碼流程。

為什麼使用 GroupDocs.Metadata for Java?

GroupDocs.Metadata for Java 提供高效能、串流式 API,支援超過 50 種輸入與輸出格式(包括 MKV),同時保持低記憶體使用量,適合大規模媒體處理。它抽象化低階 EBML 解析,讓您專注於業務邏輯,而非二進位檔案處理。

前置條件

  • GroupDocs.Metadata for Java 版本 24.12 或更新版本。
  • 已安裝 Java Development Kit (JDK) 8 或更新版本。
  • 使用 Maven(或手動 JAR 管理)來處理相依性。
  • 用於測試的 MKV 檔案,放置於可在程式碼中引用的資料夾(例如 YOUR_DOCUMENT_DIRECTORY)。

設定 GroupDocs.Metadata for Java

GroupDocs.Metadata for Java 是一個函式庫,可從超過 50 種檔案格式(包括 Matroska (MKV))讀取元資料。使用 Maven 或手動下載 JAR 以加入專案。

Maven:

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/metadata/java/</url>
   </repository>
</repositories>

<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-metadata</artifactId>
      <version>24.12</version>
   </dependency>
</dependencies>

Direct download:
如果您不想使用 Maven,可從 GroupDocs.Metadata for Java releases 下載最新版本。

取得授權

先使用免費試用版探索功能。若用於正式環境,請購買授權或從 GroupDocs 取得臨時授權,以移除試用限制。

基本初始化與設定

以下是使用 GroupDocs.Metadata 開啟 MKV 檔案所需的最小程式碼。

import com.groupdocs.metadata.Metadata;
import com.groupdocs.metadata.core.MatroskaRootPackage;

public class MetadataExtraction {
    public static void main(String[] args) {
        try (Metadata metadata = new Metadata("YOUR_DOCUMENT_DIRECTORY/input.mkv")) {
            MatroskaRootPackage root = metadata.getRootPackageGeneric();
            // Access and manipulate metadata here
        }
    }
}

如何使用 GroupDocs.Metadata 於 Java 讀取 MKV 元資料

Metadata 是代表媒體檔案的核心類別,提供存取其內嵌元資料的功能。

您可以透過為檔案建立 Metadata 實例,然後呼叫其 getter 方法——getRootPackageGeneric()、getSegments()、getTags() 與 getTracks()——來讀取 MKV 元資料的各個區段。此方式讓您完整檢視 EBML 標頭、段落資訊、使用者標籤與各軌道細節,且無需撰寫任何低階解析程式碼。

Metadata 是 GroupDocs.Metadata 中的核心類別,代表媒體檔案並提供存取其內嵌元資料的功能。

讀取 Matroska EBML 標頭

EBML 標頭儲存檔案的核心資訊,如版本、文件類型與檔案大小。

getRootPackageGeneric() 回傳 Matroska 套件的入口點,包含 EBML 級別的屬性,如 docType、version 與 fileSize。

import com.groupdocs.metadata.Metadata;
import com.groupdocs.metadata.core.MatroskaRootPackage;

public class ReadMatroskaEBMLHeader {
    public static void run() {
        try (Metadata metadata = new Metadata("YOUR_DOCUMENT_DIRECTORY/input.mkv")) {
            MatroskaRootPackage root = metadata.getRootPackageGeneric();

            String docType = root.getMatroskaPackage().getEbmlHeader().getDocType();
            String docTypeReadVersion = root.getMatroskaPackage().getEbmlHeader().getDocTypeReadVersion();
            String docTypeVersion = root.getMatroskaPackage().getEbmlHeader().getDocTypeVersion();
            String readVersion = root.getMatroskaPackage().getEbmlHeader().getReadVersion();
            String version = root.getMatroskaPackage().getEbmlHeader().getVersion();

            // Use the extracted header details as needed
        }
    }
}

重點

  • getRootPackageGeneric() 回傳 Matroska 套件的入口點。
  • EBML 屬性(docType、version 等)讓您在深入處理前驗證檔案相容性。

讀取 Matroska 段落資訊

段落描述整體媒體時間軸、建立工具以及可選的標題資訊。

getSegments() 回傳段落物件的集合,每個物件提供時長、標題與建立應用程式的細節。

import com.groupdocs.metadata.Metadata;
import com.groupdocs.metadata.core.MatroskaRootPackage;

public class ReadMatroskaSegmentInformation {
    public static void run() {
        try (Metadata metadata = new Metadata("YOUR_DOCUMENT_DIRECTORY/input.mkv")) {
            MatroskaRootPackage root = metadata.getRootPackageGeneric();

            for (var segment : root.getMatroskaPackage().getSegments()) {
                String dateUtc = segment.getDateUtc();
                long duration = segment.getDuration();
                String muxingApp = segment.getMuxingApp();
                String segmentFilename = segment.getSegmentFilename();
                String segmentUid = segment.getSegmentUid();
                long timecodeScale = segment.getTimecodeScale();
                String title = segment.getTitle();
                String writingApp = segment.getWritingApp();

                // Process the extracted segment information as needed
            }
        }
    }
}

重點

  • getSegments() 回傳集合;每個段落可擁有自己的標題、時長與建立應用程式細節。
  • 此資料有助於建立播放清單或驗證一批檔案的編碼參數。

讀取 Matroska 標籤元資料

標籤儲存人類可讀的資訊,如標題、藝術家或自訂備註。

getTags() 回傳與檔案相關的標籤條目列表,依 targetType(例如 movie、track)組織。

import com.groupdocs.metadata.Metadata;
import com.groupdocs.metadata.core.MatroskaRootPackage;
import com.groupdocs.metadata.core.MetadataProperty;

public class ReadMatroskaTagMetadata {
    public static void run() {
        try (Metadata metadata = new Metadata("YOUR_DOCUMENT_DIRECTORY/input.mkv")) {
            MatroskaRootPackage root = metadata.getRootPackageGeneric();

            for (var tag : root.getMatroskaPackage().getTags()) {
                String targetType = tag.getTargetType();
                String targetTypeValue = tag.getTargetTypeValue();
                String tagTrackUid = tag.getTagTrackUid();

                for (MetadataProperty simpleTag : tag.getSimpleTags()) {
                    String name = simpleTag.getName();
                    String value = simpleTag.getValue();

                    // Utilize the extracted tag information as needed
                }
            }
        }
    }
}

重點

  • 標籤依 targetType(例如 movie、track)組織。
  • simpleTag 條目保存鍵/值對,例如 TITLE=My Video。

讀取 Matroska 軌道元資料

軌道代表容器內的個別音訊、視訊或字幕串流。

getTracks() 提供存取每條軌道的技術規格,包括類型、編解碼器 ID、語言與位元率。

import com.groupdocs.metadata.Metadata;
import com.groupdocs.metadata.core.MatroskaRootPackage;

public class ReadMatroskaTrackMetadata {
    public static void run() {
        try (Metadata metadata = new Metadata("YOUR_DOCUMENT_DIRECTORY/input.mkv")) {
            MatroskaRootPackage root = metadata.getRootPackageGeneric();

            for (var track : root.getMatroskaPackage().getTracks()) {
                String trackType = track.getType();
                String codecId = track.getCodecId();
                String language = track.getLanguage();
                long duration = track.getDuration();
                
                // Process the extracted track information as needed
            }
        }
    }
}

重點

  • track.getType() 告訴您串流是視訊、音訊或字幕。
  • codecId 識別編解碼器(例如 V_MPEG4/ISO/AVC)。
  • 此資訊對於轉碼流程、品質檢查與動態串流決策至關重要。

讀取 MKV 元資料 (Java) 的常見使用情境

  • 媒體目錄 – 使用標題、時長與語言代碼填充資料庫表格,以加速搜尋。
  • 自動化品質控制 – 在發佈前驗證每個檔案是否包含必要的標籤且符合編解碼器標準。
  • 動態串流 – 依執行時使用者偏好選擇適當的音訊或字幕軌道。
  • 內容遷移 – 先提取元資料,然後將其注入新儲存系統或內容傳遞網路。

常見問題與疑難排解

症狀可能原因解決方法
NullPointerException 在存取 getEbmlHeader() 時發生檔案路徑不正確或找不到檔案確認 new Metadata("...") 中的路徑,並確保檔案實際存在於磁碟上。
未返回標籤MKV 檔案缺少標籤元素使用包含元資料標籤的媒體檔案(例如透過 MKVToolNix 添加的)。
大型檔案處理緩慢堆疊記憶體不足增加 JVM 堆疊大小(-Xmx2g 或更高),或在可能的情況下分塊處理檔案。
意外的編解碼器 ID較舊的 Matroska 版本未完全支援升級至最新的 GroupDocs.Metadata 版本,該版本已加入對較新編解碼器識別碼的支援。

常見問答

Q: 我可以使用相同的函式庫從其他影片格式提取元資料嗎?
A: 可以,GroupDocs.Metadata 支援 MP4、AVI、MOV 等多種格式。API 使用方式相同——只需使用對應格式的根套件類別即可。

Q: 正式環境使用是否需要授權?
A: 商業授權會移除試用限制並解鎖全部功能。此函式庫在試用模式下可供評估使用。

Q: 提取過程是否離線進行?
A: 絕對是。只要 JAR 已放入 classpath,所有元資料讀取皆在本機完成,無需任何網路呼叫。

Q: 函式庫在非常大的 MKV 檔案(數 GB)上表現如何?
A: 函式庫以串流方式處理容器結構,保持記憶體使用量適中。確保 JVM 有足夠的堆疊以容納大型標籤集合,若處理極大檔案,建議提升 -Xmx 設定。

Q: 我可以修改元資料並寫回檔案嗎?
A: GroupDocs.Metadata 主要聚焦於讀取。寫入支援有限,請參考最新的 API 文件以了解任何寫回功能。

Q: API 可處理的最大檔案大小是多少?
A: 串流架構允許處理高達 10 GB 的檔案,同時在一般伺服器配置下堆疊使用量保持在 200 MB 以下。

Q: 是否有任何執行緒安全性問題?
A: 每個 Metadata 實例都是獨立的;只要每個執行緒使用自己的實例,即可安全地平行處理多個檔案。


最後更新: 2026-11-02
測試環境: GroupDocs.Metadata 24.12 for Java
作者: GroupDocs

相關教學