EBML与XML有多相似



所以,最近,我继续尝试使用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开始,而其间的一切都可能是其他东西?还是我现在正在努力思考?

我可能在文档中遗漏了一些内容,但我似乎找不到确切的答案。然而,我会自己测试一下,但如果这不起作用,我希望能找到一个答案,让我在这里走上正确的方向。

提前感谢!

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

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

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

最新更新