Создать I Frame из P и B кадров - PullRequest
0 голосов
/ 15 мая 2018

Я написал конвертер C ++, основанный на FFMpeg, который может получить ссылку на hls-stream и преобразовать ее в локальное видео .mp4.Пока все хорошо, конвертер работает как чудо, никаких вопросов по этому поводу.

ПРОБЛЕМА: Независимо от того, какой источник ввода я предоставляю преобразователю, в конце преобразования Iнужно получать видео только с ключевыми кадрами.Мне нужно такое видео из-за идеального поиска вперед и назад.

Это хорошо известный факт, что вспомогательные видеокадры (P и B) зависят от их кадра-владельца (I-кадра), поскольку этот кадр содержит полный пиксель.карта.В соответствии с этим мы можем воссоздать I-кадр для каждого P-и B-кадра, объединив их данные с их I-кадром.Вот почему такая команда ffmpeg ffmpeg -i video.mp4 output%4d.jpg работает.

ВОПРОС: Как реализовать алгоритм объединения кадров для воссоздания только ключевых кадров в конце видео?Какие причуды мне нужно знать о слиянии данных AVPacket s?

Спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Вы не можете "объединить" P и B-кадры сжатого потока (например, с кодеком H.264), чтобы получить I-кадры.

Что делает ffmpeg с

ffmpeg -i video.mp4 output%4d.jpg

декодирует каждый кадр (таким образом, он должен начинаться с I-кадра, затем декодировать все последующие P и B-кадры в потоке), сжимать их обратно в JPEG и выводить изображение JPEG для каждого кадра в оригинале входной поток.

Если вы хотите преобразовать входной поток с кадрами P / B во внутренний поток (со всеми I-кадрами), вам необходимо перекодировать поток. Это означает, что декодируйте все кадры из исходного потока и кодируйте их обратно во внутренний поток.

...