Как добавить дополнительные ключевые кадры к видео с помощью ffmpeg?

435
jjulianf

Я хочу добавить ключевые кадры на основе определенного интервала (20 кадров) в мое видео.

Поэтому я использовал следующую команду в ffmpeg:

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=20:scenecut=0 -acodec copy out.mp4 

Вывод: я получаю ключевые кадры каждые 20 кадров.

Но оригинальное видео имело ключевой кадр, например, в frame 1, 12, 89....

Теперь у меня есть ключевые кадры в кадре 1, 21, 41....

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

frame 1, 12, 21, 41, 89.... 

Как я могу это сделать?

0

2 ответа на вопрос

2
Eugen Rieck

Краткий ответ: вы не можете

Длинный ответ: При использовании FFMpeg с перекодированием (т. Е. С любым другим кодеком, кроме copy) каждое отдельное изображение во входном потоке будет распаковано и доступно в виде полного растрового изображения. Это подразумевает, что в этой точке конвейера кадры 1, 12 и 89 больше не являются «особенными» - они являются изображениями, как и любые другие.

Когда вы теперь сжимаете через libx264, вы создаете видео с ключевыми кадрами - они будут размещаться в местах, которые вы настраиваете, в вашем случае каждые 20 кадров.

That seems to make sense, thanks for your answer! But what happens, when I have a complete scene change between frame 11 and 12 and I only get keyframes at frame 1, 21, ... ? Don't I need a keyframe at frame 12 in that case? jjulianf 5 лет назад 0
Но я мог бы добавить предыдущие ключевые кадры вручную, используя `force_key_frame`, верно? jjulianf 5 лет назад 0
Зачем тогда использовать `scencut = 0`? Пусть Scencut сделает свое волшебство! Eugen Rieck 5 лет назад 2
@jjulianf Кажется, вам нужно переписать свой вопрос, чтобы спросить о * реальной * проблеме, с которой вы столкнулись, а не о том, что вы думаете, как ее решить. (См. Http://xyproblem.info/) Вам нужны регулярные интервалы для потоковой передачи? slhck 5 лет назад 0
Примечание: значение scenecut не представляет дельта-измерения между соседними кадрами. `scenecut` также учитывает расстояние от последнего ключевого кадра, поэтому при низком значении ключевого слова scenecut никогда не может быть запущен, если последний не установлен слишком высоким. Gyan 5 лет назад 1
Я думал, что мне все еще нужны оригинальные ключевые кадры. Думал, что видео будет заикаться или что-то в этом роде, когда сцена полностью изменится, а оригинальных ключевых кадров больше не будет. Но оказалось, что он все равно играет очень хорошо .. :-) jjulianf 5 лет назад 0
1
Gyan

force_key_frames имеет возможность зеркально отображать каденцию ключевого кадра исходного потока (пока не документировано - на моем задании), однако это не может быть объединено с другими выражениями в f_k_f.

Однако то, что вы можете использовать, это

-force_key_frames source -x264-params keyint=20:scenecut=0

Это установит ключевой кадр, если исходный кадр был ключевым кадром. Однако keyint всегда измеряется по последнему набору ключевых кадров, поэтому, если у вашего источника были KF, n=0,34,55,64то результат будет иметь KF n=0,20,34,54,55,64,84- обратите внимание на отсутствие KF в 40,60,80. Также обратите внимание на последовательные KF в 54,55, так что лучше игнорировать исходные KF и позволить работать сценам.

Спасибо, приятно знать об этом варианте! Но это не совсем то, что я хотел, так как мне нужны ключевые кадры в точных кадрах. Но все же интересный вариант! jjulianf 5 лет назад 0
`-force_key_frames source`, как говорится, устанавливает * ключевые кадры в точных кадрах. * Gyan 5 лет назад 0
Да, но я имею в виду `n = 0, 20, 34, 40, 55, 60, 64, 80 ...`. Но, как я сказал в верхнем комментарии, видео по-прежнему отлично воспроизводится с моим первоначальным решением. jjulianf 5 лет назад 0
Это из-за вашего keyint = 20. Если вы установите очень большое значение (9999), исходные KF будут точно реплицированы. Gyan 5 лет назад 0

Похожие вопросы