Длина байтов заполнения PES транспортного потока MPEG2 - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь написать некоторый код на C, который будет демультиплексировать транспортный поток MPEG2 в элементарные потоки.Я использую ffmpeg для сравнения вывода, который я генерирую из моего кода.Поток вывода из моей программы в основном битовый с ffmpeg за исключением одного случая.ffmpeg, кажется, выбирает байт 0xff из потока битов, когда он находится в начале полезной нагрузки (после конца заголовка PES и байтов заполнения PES), в то время как я исключаю его как байт заполнения PES.

У меня такой вопрос: длина байта заполнения (0xff) в переменной пакета PES или она также закодирована в заголовке PES?

примечание: способ чтения полезной нагрузкиданные из пакета PES: я в основном пропускаю все начальные 0xff, пока не получу байт, не являющийся 0xff, и оттуда прочту до конца пакета

1 Ответ

2 голосов
/ 30 марта 2019

H.222.0 (03/17) (стр. 37, таблица 2-21) определяет длину последовательности stuffing_byte, рассчитанную с помощью PES_header_data_length, которая определяется как (выделениемой)

8-битное поле, определяющее общее количество байтов, занятых необязательными полями и любыми байтами заполнения , содержащимися в этом заголовке пакета PES.Наличие необязательных полей указывается в байте, который предшествует полю PES_header_data_length.

Поэтому, когда вы читаете заголовок PES, вы отмечаете все необязательные поля (например, различные комбинацииPTS_DTS_flags, ESCR_flag, ES_rate_flag и все остальное) и вычтите длину этих необязательных полей из длины, объявленной в PES_header_data_length.После того, как вы обработали все необязательные поля и оставшаяся длина n все еще не равна нулю, это означает, что есть еще n байтов заполнения, которые нужно прочитать до получения полезной нагрузки.

...