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

Следующее должно в основном иметь изображение, появляющееся в кадре 438, а затем то же самое изображение перемещается в другую позицию в кадре 339, а затем в основном исчезает для остальной части видео.

ffmpeg -i C:\src\assets\video\base.mp4 -r 25 -i C:\card.png -y \
    -filter_complex [1:v]setpts=PTS-STARTPTS+(1/TB)[1v]; \
    [0:v][1v]overlay=x=0:y=0:enable='between(t,438/25,439/25)'[1v]; \
    [0:v][1v]overlay=x=300:y=300:enable='between(t,439/25,440/25)'[2v]; \
    [1v][2v]concat=n=2:v=1:a=0[out] -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

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

Я знаю, что я близок, я могу наложить один кадр, но не могу больше.

Ответы (1)

Использовать

ffmpeg -i C:\src\assets\video\base.mp4 -i C:\card.png -y \
       -filter_complex "[0:v][1:v]overlay=x='if(eq(n,439),300,0)':y='if(eq(n,439),300,0)':enable='eq(n,438)+eq(n,439)'[out]" \
       -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

Вам может понадобиться избежать запятых в фильтрах в зависимости от вашей оболочки, т.е. n,438->n\,438

Это здорово, спасибо, намного проще, чем несколько оверлеев
Я не спрашивал об этом в исходном сообщении, но я использую это решение для анимации, я хочу в основном указать положение для X и Y на основе номера кадра. Я могу добиться этого, делая вложенные, если еще ад. но есть ли более приятный способ?
Не совсем. Фильтр не предназначен для такой анимации. Вы можете упростить это примерно так:x='0*eq(n,438)+300*eq(n,439)+X*eq(n,567)+...'
Я играл с переменной n в наложении, если бы мне нужно было сделать: overlay=x='( 605 + -0.8023952095808383 * n)':y='( 406 + -0.4365269461077843 * n)':enable='between(t,438/25,605/25)', означает ли это, что n будет равно 0 и будет увеличиваться для каждого видимого кадра? (605 - 438)
Эти выражения означают, что оверлей начинается с (605 406). С каждым кадром (0,80,0,43) вычитается, а затем округляется. Но это видно (в рассчитанных позициях) только между 17:56 и 24:20.
Спасибо, я понял эту часть, но делает ли: n == 0 в кадре 438 и n == 1 в кадре 439?
Нет, nкадра нет. Первый кадр n = 0.
Итак, в моем примере n будет равно 438, когда оно впервые станет видимым?
Верно...
Можешь дать мне совет по зумпану? Я в основном пытаюсь прикрепить к концу наложения эффект масштабирования, который уменьшает изображение после начального кадра (438 и увеличивает масштаб до 0,43). Это то, что я пробовал, но, похоже, он не применяет масштабzoompan=z='if(gte(in,438),min(pzoom-0.04,0.43),1)':d=1
zoompan не может уменьшить масштаб до холста большего размера, чем ввод. Вы должны будете дополнить видео заранее.
Я не понимаю, что вы имеете в виду под этим приятелем
Кроме того, масштабирование находится на слое с наложенным изображением, так что масштабирование не применяется только к нему?
На самом деле я теперь тоже вижу анимированный фон, черт возьми
Представляет zoomвеличину масштабирования, если входная ширина равна 100, тогда масштабирование = 2 обрезает окно шириной 50 пикселей. масштабирование не может быть ниже 1. Вы должны дополнить кадр объекта дополнительными пикселями (которые могут быть прозрачными), а затем уменьшить масштаб этого дополненного кадра.
Итак, если входная ширина на самом деле 1659, а основное видео 1920, мне нужно дополнить разницу между ними?
zoompan работает с одним входом. Если этот ввод является результатом наложенного фильтра, zoompan ничего об этом не знает. Все, что он видит, это составное изображение. Возможно, опубликуйте новый вопрос с иллюстрацией того, что вы пытаетесь сделать.
Я сделал это, video.stackexchange.com/questions/24339/… если вы не возражаете, посмотрите, сейчас работаю над добавлением GIF в этот пост.