Итак, недавно я пошел дальше и попытался возиться с форматом EBML, используемым Матроской.Я поставил себе цель последовательно анализировать субтитры в MKV из двоичного потока.
Я знаю идентификаторы кластеров, блоков и дорожек, которые можно использовать, и могу без проблем получить конкретный идентификатор дорожки субтитров.
Проблема начинается при попытке проанализировать оставшуюся часть файла.Я знаю, что субтитры разбросаны по файлу внутри блоков.Блоки вложены в группу блоков, которые снова находятся внутри кластера.Кластер имеет общую временную метку, а блоки содержат смещения этой временной метки.
Проблема в том ... Я не могу найти субтитры последовательно.
В настоящее время я делаю самую простую вещь (которая определенно не оптимальна и абсолютно не точна), где я анализирую каждый кластер, каждую группу блоков, а затем каждый блок и проверяю, содержит ли блок идентификатор дорожки.Затем я преобразую все двоичные данные в этом блоке в строку (да).Что я тогда ожидал бы, так это то, что где-то в мусоре находится фактический субтитр, представленный в виде двоичного UTF-8, закодированного в этом блоке.
Теперь, как я уже сказал, я разделил двоичный поток, используя идентификатор кластера, идентификатор группы блоков и идентификатор блока.Но моя первая «мысль» заключалась в том, как можно обнаружить конец кластера, или конец группы блоков, или конец блока?
Итак, я начал читать больше о EBML (я оказался совершенно неподготовленным, просто с таблицей идентификаторов EBML с сайта matroska).Я обнаружил, что EBML должен быть похож на XML в том, как он хранит данные, определяя теги и тому подобное.Мне было интересно, если он похож на XML, тогда как XML использует формат <tag></tag>
для представления начала и конца поля, делает ли EBML то же самое?Что определяет конец кластера или любого другого поля в EBML?Возможно ли второе вхождение идентификатора кластера КОНЕЦ этого кластера?И начинается ли следующий кластер со следующего идентификатора кластера, и все, что между ними, возможно, является чем-то другим?Или я сейчас надумал?
Возможно, я что-то упустил в документации, но просто не могу найти однозначного ответа.Тем не менее, я сам проверю это, но если это не сработает, я надеюсь найти ответ, который поможет мне в правильном направлении.
Заранее спасибо!