4

Несколько аудиопотоков, видеопотоков и субтитров хранятся в одном контейнере. Они воспроизводятся вместе.

Где хранится информация синхронизации в формате контейнера? В метаданных или где-то еще?

1 ответ1

2

Это зависит от самого контейнера. Различные контейнеры обрабатывают синхронизацию по-разному. Разница заключается в способе хранения самих данных.

Например, контейнер может просто хранить части, которые должны быть представлены одновременно, или вставлять точки синхронизации время от времени, или даже давать каждому фрагменту данных временную метку.

Некоторые контейнеры могут быть основаны на времени, в то время как другие являются просто потоком данных. Конечно, последний имеет преимущества в производительности, но синхронизация может быть отключена, и поиск невозможен без определенного индекса (как в AVI).


Например, транспортный поток MPEG-2, очень ранний формат контейнера, использует пакетные элементарные потоки для хранения данных. Например, у вас будет один пакетированный поток для видео и один для аудио. Чтобы синхронизировать их, есть поле «Program Clock Reference»:

Чтобы дать возможность декодеру представить синхронизированный контент, такой как аудиодорожки, соответствующие связанному видео, по меньшей мере, один раз каждые 100 мс задание тактового сигнала программы или PCR передается в поле адаптации пакета транспортного потока MPEG-2. PID с PCR для программы MPEG-2 определяется значением pcr_pid в соответствующей таблице программных карт. Значение PCR, при правильном использовании, используется для генерации system_timing_clock в декодере. При правильной реализации STC-декодер обеспечивает высокоточную временную базу, которая используется для синхронизации элементарных потоков аудио и видео.


Популярный контейнер MP4 основан на формате файлов QuickTime и поэтому имеет общую базу функций. Его спецификацию можно найти здесь. Синхронизация не является частью метаданных, это часть самих данных. Я не изучал детали все же.

При использовании RTP Hint Tracks файл MP4 можно подготовить для потоковой передачи, указав, какие пакеты соотносятся с какой меткой времени в мультимедиа. Так, например, дорожка подсказки скажет: этот пакет здесь состоит из этих видеоданных и этих аудиоданных. Они игнорируются для локального воспроизведения, хотя.


Контейнеры AVI основаны на RIFF. Они хранят отдельные кадры данных в "кусках". Поскольку сами данные можно разделить на отдельные кадры (например, видеокадры, аудиокадры), это работает даже с контентом с битрейтом, поскольку длина кадра всегда будет одинаковой. Этот документ подробно объясняет формат AVI. Важным аспектом синхронизации является то, что AVI правильно мультиплексирован.


Контейнер Matroska похож на MP4 и другие. Это полностью основано на временном коде, как вы можете видеть на этой диаграмме. Сами данные (например, видео, аудио) делятся на кластеры, а затем блоки. Временной код более или менее обрабатывается как временная метка представления.

Однако, чтобы избежать путаницы, я хочу упомянуть одну вещь - временный код. Быстрый взгляд заметит, что для каждого кластера отображается один временный код, а затем еще один в самой структуре блоков. То, как это работает, заключается в том, что временной код в кластере относится ко всему файлу. Обычно это временный код, в котором должен быть воспроизведен первый блок в кластере. Временной код в самом блоке относится к временному коду в кластере. Например, допустим, что временной код в кластере установлен на 10 секунд, и у вас есть блок в этом кластере, который должен воспроизводиться 12 секунд в клипе. Это означает, что временной код в блоке будет установлен на 2 секунды


Контейнер Ogg, который не является популярным, делает это следующим образом :

Группировка определяет, как чередовать несколько логических битовых потоков по страницам в одном физическом битовом потоке. Например, группирование необходимо для перемежения видеопотока с несколькими синхронизированными аудиодорожками с использованием разных кодеков в разных логических битовых потоках.

Однако Ogg ничего не знает о кодеке и концепции "времени":

У Ogg нет понятия «время»: он знает только о последовательно увеличивающихся, единичных маркерах положения. Приложение может получать временную информацию только через верхние уровни, которые имеют доступ к API-кодекам для назначения и преобразования позиций гранул или времени.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .