EBML与XML有何相似之处?

时间:2018-10-27 10:13:58

标签: xml parsing matroska

因此,最近,我继续尝试弄乱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开始,并且介于两者之间的其他内容是否可能是其他内容?还是我现在想努力奋斗?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

EBML实际上与XML不相似。 XML恰好在创建Matroska时就很流行,因此主要作者发现XML类比很有用,并且作为官方文档的一部分。

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

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