在 Matroska 文件中查找特定曲目

问题描述

我正在尝试编写一个程序来在 Matroska 文件 (.mkv) 中找到字幕轨道。我知道存在执行此操作的不同实用程序(GUI、CLI 等),但我的目标是练习阅读二进制文件格式(我是该领域的初学者)并理解(结构上)Matroska 文件格式。这个问题的重点是为我的下一步寻求指导。欢迎提供代码片段,但不要求提供。作为旁注,我对了解视频的播放方式完全不感兴趣。我只想知道如何以编程方式从容器中定位和提取特定数据,而忽略其余的。

到目前为止我所做的

我首先阅读了 official technical documentation of the Matroska file format。我的理解是,不同类型的信息存储在所谓的“顶级元素”中。出于我的目的,我需要在名为“Tracks”的顶级元素中找到“subtitle”轨道。为此,我应该首先找到并解析“SeekHead”顶级元素,它以某种方式通过某种索引告诉我这个顶级元素的位置。

疑问

  1. 根据Matroska v4 element specification,SeekHead 元素不是强制性的。这意味着我可能必须迭代所有轨道元素,直到找到字幕轨道,从而使我无法忽略其余数据。我该怎么办?
  2. 我究竟如何使用我找到的职位?例如,在 mkv 文件上使用 mkvinfo,我可以看到在 SeekHead 中有 5 个 Seek 条目。这些有一个 ID 和一个位置。我是在二进制文件中查找 ID,还是可以以某种方式使用该位置跳转到该条目的开头?

mkvinfo results

代码

这就是我想象我会做上面提到的事情的方式。我没有明确的想法,因为我没有这方面的经验。

  1. 打开可查找缓冲区到 mkv 文件
  2. 开始读取字节,直到找到标识 SeekHead 元素的字节序列。
  3. 假设我找到了它,在给定的位置寻找缓冲区
  4. 找到指向 Tracks 元素的 Seek 条目
  5. 假设我找到了它,寻找到给定位置的缓冲区
  6. 以某种方式从轨道中提取数据

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)