Как добавить дополнительные ключевые кадры к видео, используя ffmpeg?

0

Я хочу добавить ключевые кадры на основе определенного интервала (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....

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

jjulianf
источник

Ответы:

2

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

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

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

Евгений Рик
источник
Кажется, это имеет смысл, спасибо за ваш ответ! Но что происходит, когда у меня полное изменение сцены между кадрами 11 и 12, и я получаю только ключевые кадры в кадрах 1, 21, ...? Разве мне не нужен ключевой кадр в кадре 12 в этом случае?
jjulianf
Но потом я мог бы добавить предыдущие ключевые кадры вручную, используя force_key_frame, верно?
июля
2
Зачем тогда использовать scencut=0? Пусть Scencut сделает свое волшебство!
Евгений Рик,
@jjulianf Кажется, вам нужно переписать свой вопрос, чтобы спросить о реальной проблеме, а не о том, что, по вашему мнению, является решением. (См. Xyproblem.info ) Вам нужны регулярные интервалы для потоковой передачи?
Slhck
1
Примечание: значение scenecut не представляет дельта-измерения между соседними кадрами. scenecutтакже учитывает расстояние от последнего ключевого кадра, поэтому при низком значении ключевого слова сценарий никогда не может быть запущен, если последний не установлен очень высоким.
Джан
1

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 и позволить работать сценам.

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