Как найти значения разрешения и частоты кадров в H.264 MPEG-2 TS?

Я работаю над видео MPEG-2 TS, содержащим поток H.264, и ищу свойства видео, хранящиеся в потоке, путем сканирования PAT, PMT, PES и т. д.

Я могу читать PAT, PMT и тип элементарных потоков и PID. Здесь я хотел бы найти разрешение и частоту кадров (fps). Находятся ли они в заголовке PES или где-то еще? Их нет в PAT или PMT.

Ниже редактор пакетов Transport Stream может найти две разные информации, одну саму, а другую из вспомогательного кодека Haali Media Decoder. Как получить первый:

введите здесь описание изображения

Псевдокод приветствуется.


person Velcro    schedule 20.08.2014    source источник


Ответы (4)


Я не уверен в наличии информации о высоте и ширине в заголовке MPEG2TS. Потому что файл TS может иметь несколько программ. Но если вы нацелены только на файлы TS, созданные из элементарного потока H.264, тогда вы получите эту информацию из SPS элементарного потока H.264.

Каждый кадр H.264 начинается с заголовка последовательности из четырех или трех байтов 0x00 0x00 0x01 или 0x00 0x00 0x00 0x01. Кадр является кадром SPS, если выполнение операции И со следующим байтом после начальных заголовков равно 0x07.

Например. Кадр SPS 0x00 0x00 0x00 0x01 0x67 ... Выполнение операции И (0x67 и 0x1F) = 0x07

Разбор заголовка SPS также непростая задача, но вы можете найти подробности в исходном коде ffmpeg.

Надеюсь это поможет.

person pragnesh    schedule 20.08.2014
comment
Здорово! Таким образом, заголовок SPS - правильный способ найти это. Благодаря вашему ответу я смог найти еще один вопрос: stackoverflow.com/questions/12018535/ - person Velcro; 24.08.2014

Нет, в заголовке PES их не было. Чтобы найти разрешение и частоту кадров из видео H.264 в MPEG2-TS, вам необходимо проанализировать SPS (набор параметров последовательности) из потока H.264.

Вот шаги для разбора единиц H.264 NAL (уровня сетевой адаптации):

  1. Разобрать префикс блока NAL (префикс блока NAL состоит из 3 (0x00,0x00,0x01) или 4 (0x00,0x00,0x00,0x01) байтового кода), затем заголовок (следующий байт после кода префикса)

  2. Проверьте тип блока NAL (последние 5 бит) из байта заголовка.

  3. Если блок NAL имеет тип 7, это означает, что этот блок NAL является блоком SPS NAL, затем проанализируйте код

По этой ссылке ITU приведена документация по h.264. стандарт.

См. раздел 7.3.2.1.1: Синтаксис данных набора параметров последовательности дает синтаксис для поиска параметров в SPS.

person user2406774    schedule 24.09.2014

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

$ ffprobe -v quiet -show_streams output1.mp4 
[STREAM]
index=0
codec_name=h264
... // A bunch of stream data
width=1280
height=1024
sample_aspect_ratio=1:1
display_aspect_ratio=5:4
....
r_frame_rate=30000/1001
avg_frame_rate=30000/1001
time_base=1/30000
...
[/STREAM]
person deadcode    schedule 23.08.2014
comment
Это могло бы мне помочь, но чтение всего кода ffprobe для меня не самый простой способ. - person Velcro; 24.08.2014

Информация, которую вы ищете, находится внутри модулей H.264 SPS NAL.

Вам необходимо проанализировать данные PES, извлечь NALU, а затем проанализировать данные SPS. Там вы найдете разрешение. Если SPS несет информацию VUI, у вас есть информация о желаемой частоте кадров.

MPEG2-TS — это транспортный поток, он что-то транспортирует, но не несет подробной информации о том, что он несет. Он просто заворачивает вещи.

Что вы могли бы использовать из MPEG2-TS, так это PTS/DTS заголовка PES и усреднить частоту кадров из предоставленных меток времени представления.

Чтобы сделать это правильно, проанализируйте заголовок PES, проанализируйте заголовки NALU, проанализируйте фактический блок SPS NAL и, если он присутствует, VUI, который он содержит.

person scythe42    schedule 24.09.2014