Остальные части
Как я уже говорил раньше, после кодирования звук и изображение нарезаются на части (пакеты) [переменной длины], к каждому из которых добавляется заголовок.
Последовательность пакетов от одного аудио- или видеопотока называется Пакетированным Элементарным Потоком (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 довольно легко преобразуются друг в друга. При этом не требуется изменение самих данных, а только некоторая перепаковка и добавление/удаление служебных пакетов. Формальные алгоритмы этих преобразований описаны в стандарте.
Как я уже говорил раньше, после кодирования звук и изображение нарезаются на части (пакеты) [переменной длины], к каждому из которых добавляется заголовок.
Последовательность пакетов от одного аудио- или видеопотока называется Пакетированным Элементарным Потоком (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:
no subject
Видео концертов “АукцыонЪ” “Девушки Поют” в Питере и Москве вышли с multi angle. Я офигел, когда увидел.
no subject
no subject