提取 MKV 元数据 Java 与 GroupDocs.Metadata

多媒体文件无处不在,能够读取它们的内部细节对于媒体管理、目录编制和分析至关重要。在本教程中,您将学习 如何使用强大的 GroupDocs.Metadata 库提取 mkv metadata java。我们将演示如何设置库、提取 EBML 头、段信息、标签和轨道数据,并展示这些知识在实际场景中的价值。

快速答案

  • “extract mkv metadata java” 是什么意思? 这是使用 Java 以编程方式读取 MKV 文件元数据的过程。
  • 应该使用哪个库? 使用 GroupDocs.Metadata for Java,它提供了对 Matroska 文件的完整 API。
  • 需要许可证吗? 免费试用可用于评估;购买许可证后可去除使用限制。
  • 可以读取其他格式吗? 可以,同一库支持 MP4、AVI、MP3 等多种格式。
  • 运行时需要网络连接吗? 不需要,所有提取工作在本地完成,只要将库添加到项目中即可。

什么是 Matroska (MKV) 元数据?

Matroska 是一种开放、灵活的容器格式。其元数据包括 EBML 头(文件版本、文档类型)、段详情(时长、复用应用程序)、标签(标题、描述)以及轨道规格(音频/视频编解码器、语言)。访问这些数据可以帮助您构建媒体目录、验证文件完整性或自动生成缩略图。

为什么选择 GroupDocs.Metadata for Java?

  • 功能完整的 API – 处理 EBML、段、标签和轨道,无需低层解析。
  • 性能优化 – 即使是大文件也能高效工作。
  • 跨格式支持 – 同一代码库可复用于其他音视频容器。
  • 简单的 Maven 集成 – 添加单个依赖即可开始提取。

前置条件

  • GroupDocs.Metadata for Java 版本 24.12 或更高。
  • 已安装 Java Development Kit (JDK)。
  • Maven(或手动管理 JAR)。
  • 一个用于实验的 MKV 文件(放置在 YOUR_DOCUMENT_DIRECTORY 中)。

设置 GroupDocs.Metadata for Java

使用 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>

直接下载:
如果不想使用 Maven,可从 GroupDocs.Metadata for Java releases 下载最新版本。

获取许可证

先使用免费试用探索功能。生产环境请购买许可证,或从 GroupDocs 获取临时许可证以去除试用限制。

基本初始化和设置

下面的代码展示了打开 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 提取 mkv metadata java

接下来我们将逐一介绍可以读取的各类元数据。

读取 Matroska EBML 头

EBML 头存储文件的核心信息,如版本和文档类型。

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 属性(docTypeversion 等)帮助您验证文件兼容性。

读取 Matroska 段信息

段描述整体媒体时间线和创建工具。

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 标签元数据

标签存储人类可读的信息,如标题、艺术家或自定义备注。

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(例如 movietrack)组织。
  • simpleTag 条目保存键/值对,如 TITLE=My Video

读取 Matroska 轨道元数据

轨道代表单独的音频、视频或字幕流。

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)。
  • 这些数据对转码流水线或质量检查至关重要。

常见问题与故障排除

症状可能原因解决方案
NullPointerException 在访问 getEbmlHeader() 时出现文件路径不正确或文件未找到检查 new Metadata("...") 中的路径并确保文件存在。
未返回标签MKV 文件缺少标签元素使用包含元数据标签的媒体文件(例如通过 MKVToolNix 添加的)。
大文件处理缓慢堆内存不足增加 JVM 堆大小(-Xmx2g 或更高),或在可能的情况下分块处理文件。

常见问答

问:我可以使用同一库提取其他视频格式的元数据吗?
答:可以,GroupDocs.Metadata 支持 MP4、AVI、MOV 等多种格式。API 使用方式类似,只需使用相应的根包类。

问:生产环境是否必须购买许可证?
答:许可证可去除试用限制并提供完整功能。库在试用模式下可用于评估。

问:提取过程是否离线进行?
答:完全离线。只要 JAR 在类路径中,所有元数据读取均在本地完成,无需网络请求。

问:在处理非常大的 MKV 文件(数 GB)时性能如何?
答:库会流式读取容器结构,保持内存占用适中,但请确保 JVM 有足够的堆空间以容纳可能的大型标签集合。

问:我可以修改元数据并写回文件吗?
答:GroupDocs.Metadata 主要侧重于读取。写入功能有限,请查阅最新 API 文档了解写入支持情况。

结论

现在您已经掌握了使用 GroupDocs.Metadata 提取 mkv metadata java 的完整、可用于生产的指南。通过访问 EBML 头、段信息、标签和轨道细节,您可以为媒体目录、自动质量检查或视频流服务提供强大支持。尝试代码片段,依据自己的工作流进行适配,并探索库对更多格式的支持,以实现更广阔的可能性。


最后更新: 2025-12-22
测试环境: GroupDocs.Metadata 24.12 for Java
作者: GroupDocs