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, поэтому я больше не могу помочь. К сожалению