Кратко

  • RFC 9559 позволяет подтвердить корректный документ EBML, описанные дорожки и структуру Blocks. Такой квиток заканчивается до проверки возможностей кодека, замыкания ссылок и синхронного показа.
  • Cues может индексировать лишь часть времени и дорожек, а live-поток вправе обойтись без него. Попадание в индекс не доказывает, что переход пришёл к видимому кадру, с которого можно корректно декодировать дальше.
  • Флаги Default и Forced служат входом для политики плеера, но не фиксируют звук, субтитры или доступность, реально полученные конкретным зрителем.

Reader открывает Matroska, принимает заголовок EBML и проходит по допустимому дереву элементов. Этот локальный успех легко переименовать в «файл воспроизводится». Опубликованный в октябре 2024 года стандарт IETF RFC 9559 осторожнее: он определяет контейнер — идентичность дорожек, хранение закодированных кадров, шкалы времени и индексы. Ни один из этих механизмов ещё не экран.

История ID 0x80 показывает первенство работающего кода без романтизации. RFC 8794 зарезервировал значение, хотя реализации Matroska уже применяли его для ChapterDisplay. RFC 9559 узаконил практику. Общий документ догнал развёрнутый код, но не удостоверил задним числом поведение каждого старого файла и каждого reader.

Совместимость может быть неполной по замыслу

DocTypeVersion охватывает самый новый элемент, использованный в файле. DocTypeReadVersion задаёт минимальную версию для воспроизведения, в том числе с сокращённым набором функций. В примере RFC элемент CueRelativePosition версии 4 допускается при read version 2: он повышает точность seek, но не обязателен для обычного просмотра.

Совместимый reader должен пропускать неизвестные элементы, если они укладываются в размер родителя. «Открылся» может означать, что часть информации осознанно проигнорирована. Для более сильного вывода нужны версия реализации, две объявленные версии и перечень пропусков.

Block должен превратиться в кадры с историей ссылок

Block и SimpleBlock объединяют номер дорожки, время относительно Cluster, флаги, необязательный lacing и один или несколько кадров. Xiph-, EBML- и fixed-size-lacing уменьшают накладные расходы, но требуют точно восстановить внутренние границы. Конец элемента не подтверждает правильное разделение кадров.

Следующий рубеж — зависимости. Если зависимый кадр ошибочно принять за random access point, переход может дать ложный результат или аварийно завершить работу. Некоторые intra-only кадры AV1 и VP9 декодируются отдельно, но не сбрасывают состояние кодека; последующие изображения всё ещё требуют прошлое, отброшенное при переходе. Нужно доказывать не наличие кадра, а замкнутость всех ссылок, необходимых после него.

CodecID и CodecPrivate идентифицируют формат и передают начальное состояние. Единый mapping согласует имена, но не устанавливает decoder, не подтверждает профиль и не гарантирует выход. Это самостоятельный квиток возможностей.

Считанное время ещё не стало временем зрителя

PTS блока складывается из времени Cluster, знакового значения Block, TrackTimestampScale, TimestampScale и при наличии CodecDelay. Кадр с отрицательным временем иногда требуется декодировать, но нельзя показывать. Дробный результат следует округлить до ближайшей наносекунды.

RFC прямо отмечает, что многие исторические readers игнорируют TrackTimestampScale, отличный от 1.0. Две реализации способны построить разные рабочие временные линии из одного синтаксически допустимого файла. При наложении в Track operations базовая система может отбросить кадры или отрисовать их по-разному.

Поэтому следует сохранять входы вычисления и сравнивать полученные метки, A/V-синхронизацию и отпечатки выхода. Разобранное целое число не равно правильно показанному моменту.

Cues указывает маршрут, но не завершает переход

Cues индексирует выбранные Cluster для быстрого доступа к абсолютному времени. Можно указать каждый Block или выборку. Для файла не в live-режиме Cues рекомендуется, как и точки для ключевых видеокадров; аудио допускается не индексировать при наличии видео. Без Cues reader всё ещё может искать по файлу.

Проверка должна установить покрытие нужной дорожки и времени, правильность Cluster и относительной позиции, замыкание ссылок и отклонение показанного кадра от запрошенного. Индексный hit закрывает лишь адресацию.

Live-режим намеренно меняет контракт. Непрерывные Segments не должны использовать SeekHead, Cues, Chapters и Attachments. Поток без двух списков в начале следует считать не допускающим seek. Это может быть корректно для эфира и недостаточно для обещания перемотки.

Контейнер не выбирает за пользователя

FlagDefault лишь делает дорожку кандидатом автоматического выбора по языку; плеер вправе переопределить его ради доступности. FlagForced просит показывать определённые субтитры даже тогда, когда выбранный звук обычно их не требует. Есть отдельные флаги для нарушений слуха и зрения, описаний, оригинала и комментария.

Это входные данные политики, а не итог. Доказательство связывает флаги с предпочтениями, приоритетами player, фактически выбранными Track UID и слышимым или видимым canary. В терминах Heng Lu RFC координирует, а конкретные байты, работающий код, decoder, renderer и наблюдаемый выход показывают реальность.