Überlagerung von Wasserzeichen nach Videogröße mit ffmpeg

5735
face

Ich möchte ein Wasserzeichen auf 5% der Videobreite skalieren.

Ich brauche so etwas:

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 

Wie kann ich die Videobreite referenzieren?

2

3 Antworten auf die Frage

5
Gyan

This can now be performed directly using the scale2ref filter.

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 
Hey, Ihr Befehl funktioniert und danke, aber das Seitenverhältnis des Wasserzeichens wird nicht beibehalten, es streckt es auf die Videogröße. Wie man es repariert ? Emad Ghasemi vor 7 Jahren 0
@EmadGhasemi, wenn Sie ein Seitenverhältnis wünschen. Zunächst müssen Sie das Wasserzeichenverhältnis (Höhe / Breite) berechnen. Dann ändere dies [1: v] [0: v] scale2ref = iw * 0,05: (iw * 0,05) * Wasserzeichenverhältnis [logo1] [Basis] Ahmet KAPIKIRAN vor 7 Jahren 0
Sehen Sie meinen Kommentar in dieser Antwort hier: https://superuser.com/a/1100429/85904 Sie können dies jetzt mit einem Befehl tun bhh1988 vor 6 Jahren 0
3
NuTTyX

Angenommen, eine Linux-Umgebung (oder Cygwin unter Windows) ist die einzige Möglichkeit, zwei Befehle auszuführen.

Erste Hauptvideogröße und führt Mathematik auf sie (Anmerkung zu bekommen: 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 '` 

Zweitens das Video skalieren und überlagern

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 

Sie könnten auch $valin der zweiten Zeile den ersten Ausdruck (einschließlich Backquotes) ersetzen und dasselbe Ergebnis erzielen, aber ich finde es etwas einfacher, den Aufsplittbefehl in zwei Zeilen zu lesen.

Weil es so aussieht, als gäbe es keine andere Lösung, akzeptiere ich Ihre. Vielen Dank! face vor 9 Jahren 0
1
F'K

As for Windows, I discovered following method using ffprobe and ffmpeg. Here is a .bat file code:

@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" ) 

)

Here SLACE_FACTOR is overlay image width divided to some reference video file width (for ex., 320px/1280px).

Ich denke nicht, dass die linken und rechten Klammern im Code übereinstimmen. techraf vor 8 Jahren 0