FFmpeg - Как масштабировать видео, затем применить водяной знак?

Я пытаюсь масштабировать видео, чтобы он всегда был 512 широко, где высота изменяется пропорционально исходному видео. После масштабирования я затем хочу применить водяной знак/наложение к видео, поэтому видео будет масштабироваться, но водяной знак не будет.

Я могу получить каждый из них отдельно, используя следующие фильтры:

Scale

-vf "scale=512:-1"

Водяной знак

-vf "movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Они работают успешно самостоятельно.

Однако, пытаясь совместить два, у меня есть немного проблем.

Наличие обоих параметров, конечно, не работает, так как один будет переопределять другой.

Ive попробовал:

-vf "scale=512:-1,movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Я думал, что масштаб будет применен сначала, чем водяной знак, но все, что я получаю, это ошибка

Слишком много входов, указанных для фильтра фильма.

Фильтры открытия ошибок!

Затем, изменив, на a; привело к:

Масштаб простого фильтра: 512: -1; фильм = watermark.png [Водяной знак]; [В] [Водяной знак] overlay = (main_w-overlay_w)/2: (main_h-overlay_h)/2 [out] 'не имеет ровно один вход и выход.

Фильтры открытия ошибок!

Я предполагаю, что мне нужно сделать что-то еще с фильтрами, но Im изо всех сил пытается понять это.

Любые идеи кто-нибудь?

Большое спасибо заранее.

Ответ 1

Спасибо вам как @DiJuMx, так и @LordNeckbeard, вы оба приблизили меня к моему решению. Ive еще не пробовал параметр filter_complex, но он, конечно, выглядит проще.

Решение, которое я нашел для работы, это:

-vf "movie=watermark.png [watermark]; [in]scale=512:trunc(ow/a/2)*2 [scale]; [scale][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Обратите внимание, что Ive заменил значение -1 в шкале, поскольку это могло вызвать неравномерное количество пикселей в высоте видео при масштабировании, которое затем вызвало бы ошибки кодирования.

Ответ 2

Вы можете использовать опцию -filter_complex со шкалой и фильтрами наложения:

ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v]scale=512:-1[bg];[bg][1:v]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" output
  • Смотрите scale и overlay фильтр для дополнительной информации.
  • Нет необходимости в источнике источника movie, как в других примерах.
  • Вы можете добавить -c:a copy, если хотите передать копию (повторное перемещение) исходного звука вместо его повторного кодирования. Это полезно, если форматы входных и выходных контейнеров одинаковы.
  • Пример разместит логотип в центре. Для других вариантов размещения:
    • Верхние левые с заполнением 10 px: overlay=10:10
    • Верхний правый с отступом 10 px: overlay=W-w-10:10
    • Нижнее правое с отступом 10 px: overlay=W-w-10:H-h-10
    • Нижний левый с отступом 10 px: overlay=H-h-10:10

Ответ 3

Насколько я понимаю, это может сработать:

-vf "movie=watermark.png [watermark]; [in] scale=512:-1,[watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Вы применяете фильтр масштаба к входу "[in]".

К сожалению, у меня нет большого опыта работы с фильтрами ffmpeg, поэтому я больше не могу помочь. К сожалению