Масштабирование наложения водяных знаков по размеру видео с помощью ffmpeg

5698
face

Я хотел бы масштабировать водяной знак до 5% ширины видео.

Мне нужно что-то подобное:

ffmpeg -i 1.mp4 -i logo.png -filter_complex "[1:v] scale=1_MP4_VIDEO_WIDTH*0.05:-1 [logo1]; [0:v][logo1] overlay=0:0" -y -b 1600k -c:v libx264 -profile high -level 4.1 -c:a libfaac -q:a 128k 2.mp4 

Как я могу сослаться на ширину видео?

2

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

5
Gyan

Теперь это можно выполнить напрямую с помощью scale2refфильтра.

ffmpeg -i 1.mp4 -i logo.png \ -filter_complex "[1:v][0:v]scale2ref=iw*0.05:-1[logo1][base]; \ [base][logo1]overlay=0:0[v]" \ -map [v] -map 0:a -y -b:v 1600k -c:v libx264 -profile high -level 4.1 \ -c:a libfaac -b:a 128k 2.mp4 
Эй, ваша команда работает и спасибо, но она не поддерживает соотношение сторон водяного знака, она растягивает его до размера видео. Как это исправить? Emad Ghasemi 7 лет назад 0
@EmadGhasemi, если вы хотите соотношение сторон. Во-первых, вы должны рассчитать соотношение водяных знаков (высота / ширина). Затем измените это [1: v] [0: v] scale2ref = iw * 0,05: (iw * 0,05) * watermark_ratio [logo1] [base] Ahmet KAPIKIRAN 7 лет назад 0
Смотрите мой комментарий в этом ответе здесь: https://superuser.com/a/1100429/85904 Теперь вы можете сделать это с помощью одной команды bhh1988 6 лет назад 0
3
NuTTyX

Предполагая среду linux (или cygwin на windows), я нашел единственный способ выполнить 2 команды.

Сначала, чтобы получить основной размер видео и выполнить математику на них (примечание x/20 == x*0.05:

val=`ffmpeg.exe -i 1.mp4 2>&1 | grep Video: | sed 's_.*, \([0-9]*x[0-9]*\) .*_\1_' | awk 'BEGIN '` 

Второй масштабировать и наложить видео

ffmpeg -i 1.mp4 -i logo.png -filter_complex "[1:v] scale=$val [logo1]; [0:v][logo1] overlay=0:0" -y -b 1600k -c:v libx264 -profile high -level 4.1 -c:a libfaac -q:a 128k 2.mp4 

Кроме того, вы можете просто заменить $valво второй строке первое выражение (включая обратные кавычки) и получить тот же результат, но я считаю, что немного проще читать команду разбиения на две части.

Потому что кажется, что нет другой души, я принимаю вашу. Спасибо! face 9 лет назад 0
1
F'K

Что касается Windows, я обнаружил следующий метод с использованием ffprobe и ffmpeg. Вот код файла .bat:

@echo off SetLocal EnableExtensions EnableDelayedExpansion  for %%a in ("*.mp4") do ( For /F "usebackq" %%I In (`ffprobe -v error -show_entries stream"="width -of default"="noprint_wrappers"="1:nokey"="1 "%%~a"`) Do (  Set V=%%~I ffmpeg -i "%%a" -i logo.png -b:v 1M -filter_complex "[1:v]scale=(SCALE_FACTOR*!V!):-1 [wm]; [0:v][wm] overlay=x=(main_w-overlay_w):y=(main_h-overlay_h)" -y -v 2 "new\%%~na.mp4" ) 

)

Здесь SLACE_FACTOR - ширина наложенного изображения, деленная на некоторую ширину эталонного видеофайла (например, 320px / 1280px).

Я не думаю, что левая и правая скобки совпадают в коде. techraf 8 лет назад 0

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