November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Sunday, May 4th, 2008 10:58 pm
Остальные части

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



Последовательность пакетов от одного аудио- или видеопотока называется Пакетированным Элементарным Потоком (Packetized Elementary Stream, PES).

Один или несколько аудио- и/или видео- PES составляют программу (program). Да, несколько видеопотоков в программе тоже бывает. Например, крайне редко, но всё же встречающиеся multi-angle DVD (большинство их порнографические, потому что снимать и монтировать обычные фильмы с нескольких углов пока никто не берется - нерентабельно. Плюс небольшое число концертных записей). А в области телевещания в одной программе может идти несколько видеопотоков с разных камер, например, при трансляции спортивных соревнований, особенно автогонок.

Для записи на носитель или телевизионной трансляции пакеты от нескольких элементарных потоков выстраиваются в единую последовательность. Этот процесс называется мультиплексированием. Обратный процесс - выделения отдельных элементарных потоков из общего потока - называется демультиплексированием.
Чтобы минимизировать размеры буферов для врЕменного хранения уже пришедших, но еще не воспроизведённых пакетов в MPEG-декодере, пакеты в мультиплексированном потоке располагаются более или менее по порядку времени воспроизведения.

Мультиплексированная последовательность пакетов от потоков, относящихся к одной программе, называется Элементарный Поток (Elementary Stream, ES). Некоторые плееры и видеоредакторы умеют работать с ES, находя там аудио и видео самостоятельно. Например, mplayer/mencoder.

Если пакеты из ES поделить на последовательные группы, и к каждой группе (pack) добавить в начале служебные пакеты, описывающие общие характеристики группы, то получится Программный Поток (Program Stream, PS). С PS умеют работать практически все плееры и редакторы, понимающие MPEG2. На самом деле, по стандарту у PS в конце еще должен присутствовать дополнительный пакет, обозначающий конец программы (Program End), но для воспроизведения и редактирования он не нужен.

PS определён стандартом в качестве основного формата для хранения данных на носителях. Именно он используется на VideoCD (хотя там MPEG1, а не 2) и на DVD.


Немного подробностей про внутреннее устройство потоков.

Строго говоря, стандарт MPEG2 (как, впрочем, и MPEG1) определяет формат потока битов, а на байты (октеты) поток делится исключительно с целью записи на носители или удобства обработки. Тем не менее, для простоты изложения я тоже буду иногда употреблять слово "байт" в значении "8 последовательных битов".

Поскольку поток в общем случае может попадать в декодер, начиная с произвольного места (реально, конечно, с границы байта), стандарт определяет последовательность из 24 битов (packet_start_code_prefix), по которой идентифицируется начало пакета: 23 нулевых бита, за которыми следует один единичный - 0x000001. Внутри пакетов такая последовательность встречаться не должна. Хотя я не поручусь, что она совсем никак не может попадаться в данных, я этот вопрос специально не изучал, но заголовки пакетов устроены таким образом, что там точно не может. В проблемных местах специально вставляются разделители из единичных битов.

За стартовой последовательностью следует байт, определяющий тип пакета, который в стандарте называется "идентификатор потока" (stream_id).

За ним следует 16-битовое поле, в котором указывается количество байт в пакете, следующих за этим полем. Общая длина пакета, таким образам, равна значению этого поля + 6.

Дальнейшее содержимое пакета зависит от его типа, подробности см. в ISO 13818-1.


Некоторые значения stream_id:

0xBA - pack start, начало группы пакетов в составе PS. В пакете с этим идентификатором указывается, в частности, максимальный битрейт общего мультиплексированного потока для данной группы пакетов.

0xBB - системный заголовок (system header), в котором указывается максимально возможный битрейт в группе пакетов, количество аудио- и видеопотоков, флаги фиксированного битрейта в этих потоках и пр.

0xBC - program stream map, PSM. Содержит описания элементарных потоков в группе.

0xB9 - конец программы (Program End). Последний пакет в PS.

0xFF - каталог (program stream directory). Содержит прямые ссылки на некоторые PES-пакеты программы для быстрой навигации. Естественно, это возможно только для программ, записанных на носители.

с 0xE0 по 0xEF - с 0 по 15-й видеопотоки программы

с 0xC0 по 0xDF - с 0 по 31-й аудиопотоки

0xBD и 0xBF - приватные потоки 1 и 2 (private stream 1 и 2), содержимое которых не регламентируется стандартом MPEG2, а оставляется для возможных расширений. Например, в DVD приватный поток 1 используется для субтитров и аудиодорожек в AC3, DTS и LPCM, а 2 - для нацигационных пакетов (для ускоренного воспроизведения).

0xBE - заполняющий поток (padding stream). Никакого полезного содержимого не несёт, используется для поддержания среднего битрейта общего мультиплексированного потока в случаях, когда в других потоках становится мало данных.

0xF0 и 0xF1 - зарезервированы для управления доступом, проще говоря - для ограничения возможности просмотра зашифрованных данных (Entitlement Control Messages, ECM и Entitlement Management Messages, EMM). Содержание их стандартом не регламентируется.
Но в записанных на носителях программах шифрование на этом уровне практически не используется, а как устроено шифрование в транслируемых потоках - предмет отдельного разговора.


Для трансляции в стандарте предусмотрен ещё один формат - Транспортный Поток (Transport Stream, TS).

В отличие от PS, где PES-пакеты просто разбавляются дополнительными служебными, TS добавляет новый уровень упаковки. TS-пакеты всегда фиксированной длины - 188 байт. Первый байт - признак начала пакета - 0x47, далее следует ещё три байта заголовка и 184 байта данных. PES-потоки (целиком, вместе с PES-заголовками) просто нарезаются порциями по 184 байта и раскладываются по последовательным TS-пакетам.

TS-пакеты от всех потоков программы (точнее, обычно сразу от нескольких программ), а также дополнительные потоки со служебными данными, мультиплексируются и отправляются в эфир или в кабель.

При передаче TS-пакеты на физическом уровне снабжаются корректирующими кодами, с их помощью аппаратура приёма исправляет ошибки, которые может, а которые не может - помечает специальным битом в заголовке с тем, чтобы при дальнейшей обработке эти пакеты можно было отличить.

PS и TS довольно легко преобразуются друг в друга. При этом не требуется изменение самих данных, а только некоторая перепаковка и добавление/удаление служебных пакетов. Формальные алгоритмы этих преобразований описаны в стандарте.
Tags:
Friday, March 18th, 2011 11:13 pm (UTC)
Синхронизация и вообще модель декодера описаны с формулами и картинками в вышеуказанной ISO/IEC 13818 часть 1.
А как оно на практике реализуется, можно почитать в исходниках ffmpeg или vlc.