Как рассчитать размер GOP файла H264

У меня есть файл h264, который извлекается из формата YUV с помощью программного обеспечения SVC. Теперь я хочу вычислить размер каждой GOP в файле h264. Мы знаем, что размер GOP — это расстояние между двумя ближайшими I-кадрами. здесь. Не могли бы вы предложить мне, как вычислить размер GOP данного файла h264. Лучше, если мы реализуем это на C/C++. Спасибо.


person user3677103    schedule 03.06.2014    source источник


Ответы (3)


Что ж, просто анализировать битовый поток, чтобы найти каждый I-кадр, немного сложно; среди прочего, порядок кодирования может отличаться (или не отличаться) от порядка отображения. Одним из решений является использование http://www.ffmpeg.org/ffprobe.html из пакета ffmpeg. -люкс.

Пример:

ffprobe -show_frames input.bin | grep key_frame
key_frame=1
key_frame=0
key_frame=0
key_frame=0
key_frame=0
key_frame=0
...

из вывода вы можете легко вычислить длину GOP

Другим решением является исправление эталонной реализации, найденной по адресу http://iphome.hhi.de/suehring/tml/

Дайте мне знать, если вам нужна помощь с этой частью :-)

person Fredrik Pihl    schedule 03.06.2014
comment
Большое спасибо. Но в моем случае я использовал SVC для извлечения YUV в битовый поток h264. Очень сложно определить, какой кадр является ключевым. У вас есть другое решение? - person user3677103; 03.06.2014
comment
Во-первых, что такое SVC? Вы кодируете файл YCbCr в бипоток H.264 и хотите получить длину GOP из этого файла или любого другого H.264, если уж на то пошло? - person Fredrik Pihl; 03.06.2014
comment
SVC — масштабируемое кодирование видео. Вот так. Моя цель - получить длину GOP из потока H264. - person user3677103; 04.06.2014
comment
Кто-то на самом деле использует SVC? :-) Если вам не нравится решение ffmpeg, взгляните на справочную программу, на которую я ссылался в своем ответе. Двоичный файл ldecod.exe выводит тип фрейма на стандартный вывод. Также было бы довольно просто добавить счетчик в src-code для подсчета разницы номеров кадров между IDR (I)-кадрами. - person Fredrik Pihl; 06.06.2014

Лично я предпочитаю фильтрацию по pict_type:

ffprobe -show_frames input.h264 | grep pict_type

Это покажет вам структуру кадра:

pict_type=I
pict_type=P
pict_type=P
pict_type=P
pict_type=P
pict_type=P
...
person mysteryegg    schedule 17.05.2016

используйте команду типа:

ffprobe -show_entries frame=pict_type  mp4_sample.mp4  -of flat | grep I

и вы увидите результат, как:

frames.frame.0.pict_type="I"
frames.frame.384.pict_type="I"
frames.frame.764.pict_type="I"
frames.frame.1027.pict_type="I"
frames.frame.1164.pict_type="I"
frames.frame.1544.pict_type="I"
frames.frame.1944.pict_type="I"
frames.frame.2183.pict_type="I"
frames.frame.2324.pict_type="I"
person bluesky    schedule 20.11.2019