问题描述
我正在尝试编写一个程序来在 Matroska 文件 (.mkv) 中找到字幕轨道。我知道存在执行此操作的不同实用程序(GUI、CLI 等),但我的目标是练习阅读二进制文件格式(我是该领域的初学者)并理解(结构上)Matroska 文件格式。这个问题的重点是为我的下一步寻求指导。欢迎提供代码片段,但不要求提供。作为旁注,我对了解视频的播放方式完全不感兴趣。我只想知道如何以编程方式从容器中定位和提取特定数据,而忽略其余的。
到目前为止我所做的
我首先阅读了 official technical documentation of the Matroska file format。我的理解是,不同类型的信息存储在所谓的“顶级元素”中。出于我的目的,我需要在名为“Tracks”的顶级元素中找到“subtitle”轨道。为此,我应该首先找到并解析“SeekHead”顶级元素,它以某种方式通过某种索引告诉我这个顶级元素的位置。
疑问
- 根据Matroska v4 element specification,SeekHead 元素不是强制性的。这意味着我可能必须迭代所有轨道元素,直到找到字幕轨道,从而使我无法忽略其余数据。我该怎么办?
- 我究竟如何使用我找到的职位?例如,在 mkv 文件上使用 mkvinfo,我可以看到在 SeekHead 中有 5 个 Seek 条目。这些有一个 ID 和一个位置。我是在二进制文件中查找 ID,还是可以以某种方式使用该位置跳转到该条目的开头?
伪代码
这就是我想象我会做上面提到的事情的方式。我没有明确的想法,因为我没有这方面的经验。
- 打开可查找缓冲区到 mkv 文件
- 开始读取字节,直到找到标识 SeekHead 元素的字节序列。
- 假设我找到了它,在给定的位置寻找缓冲区
- 找到指向 Tracks 元素的 Seek 条目
- 假设我找到了它,寻找到给定位置的缓冲区
- 以某种方式从轨道中提取数据
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)