0

所以,最近,我继续尝试使用 Matroska 使用的 EBML 格式。我为我设定了一个目标,即从二进制流中按顺序解析 MKV 中的字幕。

我知道要使用的集群、块和轨道 ID,并且能够毫无问题地获得特定的字幕轨道 ID。

当尝试解析文件的其余部分时,问题就开始了。我知道字幕分散在块内的文件周围。这些块嵌套在一个块组内,块组又在一个集群内。集群有一个通用时间戳,块包含该时间戳的偏移量。

问题是......我似乎无法始终如一地找到字幕。

目前我正在做最简单的事情(这绝对不是最优的,绝对不准确),我解析每个集群、每个块组,然后是每个块,并检查块是否包含轨道 ID。然后我将该块中的所有二进制数据转换为字符串(是的)。然后我期望的是,垃圾中的某处是实际的字幕,因为它是在该块中编码的二进制 UTF-8。

现在正如我所说,我使用集群 ID、块组 ID 和块 ID 拆分二进制流。但我的第一个“想法”是,到底如何检测到集群的结束、块组的结束或块的结束?

因此,我开始阅读更多关于 EBML 的内容(我完全没有准备好仅使用 matroska 网站上的 EBML ID 表)。我发现 EBML 在通过定义标签等存储数据的方式上应该类似于 XML。我想知道,如果它类似于 XML,而 XML 使用 <tag></tag>格式来表示字段的开始和结束,EBML 是否也这样做?什么定义了集群的结尾或 EBML 中的任何其他字段?集群 ID 的第二次出现可能是该集群的 END 吗?下一个集群是否从以下集群 ID 开始,并且其间的所有内容都可能是其他东西?还是我现在想得很努力?

我可能错过了文档中的某些内容,但我似乎无法找到明确的答案。但是,我将自己对此进行测试,但如果这不起作用,我希望找到一个可以让我在这里找到正确方向的答案。

提前致谢!

4

1 回答 1

2

EBML 实际上并不类似于 XML。在创建 Matroska 的时候,XML 恰好很流行,所以主要作者发现 XML 类比很有用,并且作为官方文档的一部分,它被卡住了。

EBML 中的元素由 id-length-content 编码组成,其中数值具有可变长度(1-8 个字节,由第一个字节中有多少前导零位决定)。没有结束标记,也没有 XML 中的“属性”。

格式真的很难自己解析,所以最好使用现有的EBML解析器,甚至MKV工具。端口适用于所有流行的编程语言,从 C 到 Node.js 和 Python。

于 2019-10-23T10:22:38.263 回答