所以,最近,我继续尝试使用 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 开始,并且其间的所有内容都可能是其他东西?还是我现在想得很努力?
我可能错过了文档中的某些内容,但我似乎无法找到明确的答案。但是,我将自己对此进行测试,但如果这不起作用,我希望找到一个可以让我在这里找到正确方向的答案。
提前致谢!