Демультиплексор Mpeg2 PES: как извлечь пакеты PES с видеопотоком H.264?

Я обнаруживаю новый пакет PES в демультиплексоре PES, ищущем package_start_code_prefix (0x000001). Когда это происходит, я могу прочитать PES_packet_length и извлечь текущий пакет PES из потока байтов. Но если это видеопоток H.264, то PES_packet_length=0.

Как извлечь пакет PES в таком случае? 0x000001 также может встречаться в потоке байтов последней единицы H.264, поэтому я не могу использовать этот префикс для поиска следующего пакета PES.

Я заметил, что в каждом пакете H.264 PES последняя единица в пакете PES представляет собой данные заполнителя (nal_unit_type=12). Нужно ли использовать этот факт для определения конца текущего пакета PES?


person Harry    schedule 29.01.2014    source источник
comment
Я предполагаю, что это транспортный поток? Или у вас просто есть доступ к отдельным кадрам PES?   -  person szatmary    schedule 29.01.2014
comment
Да, это транспортный поток, но после демультиплексора TS. Таким образом, у меня есть только согласованный набор пакетов PES без пакетирования TS. Это только пакеты видео PES.   -  person Harry    schedule 30.01.2014
comment
Он может быть равен нулю (что означает отсутствие ограничений), если этот пакет является видеопотоком. См. здесь en.wikipedia.org/wiki/Packetized_elementary_stream   -  person Hwangho Kim    schedule 28.08.2017


Ответы (1)


Обычно нет, это невозможно без знания длины пакета PES. Однако, поскольку вы ограничиваете себя H.264, мы можем воспользоваться удачным случаем.

Значение stream_id h.264 равно 0xE0. Первый бит nalu всегда равен 0, поэтому 000001E0 оказывается недопустимым в потоке приложения B. Вы все равно должны проанализировать заголовок PES, чтобы определить его длину, потому что первый байт после заголовка PES может быть хвостом предыдущего NALU и, таким образом, не обязательно может быть начальным кодом приложения b.

Сохраняю это для потомков. Нельзя просто искать стартовые коды, нужно разобрать пакет. Если это транспортный поток. Начало PES можно найти по индикатору начала единицы полезной нагрузки. Затем проанализируйте поле адаптации, если оно существует. Теперь у вас есть начальный код (в данном случае 000001E0. Затем посмотрите на флаги. Разберите 33-битный PTS/DTS (он понадобится вам для воспроизведения) и пропустите все необязательные поля (определяются флагами в заголовке PES). ). Теперь у вас будет начало вашего h.264 ES. Продолжайте синтаксический анализ TS. Для каждого TS с тем же PID и индикатором запуска единицы полезной нагрузки = false, вы читаете кадр. Как только индикатор начала единицы полезной нагрузки становится истинным, у вас есть новый пакер/рама PES.

person szatmary    schedule 29.01.2014
comment
Проблема в том, что у меня нет payload_unit_start_indicator, так как это поток после демультиплексора TS. Поток байтов выглядит следующим образом: - person Harry; 30.01.2014
comment
00 00 01 E0 00 00 84 C0 0A 3F 61 0D 48 C9 1F 61 0B BC 29 00 00 00 01 09 30 00 00 00 01 06 00 01 C0 80 00 00 00 01 06 01 01 1 5 01 01 24 100 00 FB 59 13 22 5F BB E2 F0 51 DE 00 83 5E ...... ..... 00 00 00 01 E0 00 00 84 C0 0A 3F 61 0D 02 79 1F 61 0B CA 39 00 00 00 01 09 50 00 00 00 01 06 00 01 C0 80 00 00 00 01 06 01 01 14 80 00 00 00 01 21 AA 9A FC 6A 51 11...... Есть ли правильный способ найти новый пакет PES в моем случае? - person Harry; 30.01.2014
comment
Спасибо за обновление ответа! Это действительно хорошее решение. - person Harry; 30.01.2014