
Ich möchte das Video bedingt unscharf machen. Beispielsweise soll bei einem 30-Sekunden-Video der Unschärfebereich von 2–10 Sekunden anders sein als bei 12–20 Sekunden.
Aber ich kann es bisher nur 1 Mal verwischen. Im Folgenden finden Sie den Befehl, mit dem ich versucht habe, das Ziel zu erreichen. MitArithematische Ausdrücke
ffmpeg -y -i with_out_sound.mp4 filter_complex [0:v]boxblur=10:enable='between(t,2,10)'[bg],[0:v]crop=206:169:3 2:121[fg],[bg][fg]overlay=32:121:enable='between(t,2,10)'[tmp];[0:v]boxblur=10: enable='between(t,12,20)'[bg],[0:v]crop=206:169:42:100[fg],[bg][fg]overlay=42:100 :enable='between(t,12,20)'[tmp2];[tmp][tmp2]concat[tmp3] -map [tmp3] with_out_sou ndd.mp4
aber mit dem obigen Befehl zuerst das komplette Video verwischen (2-10) und dann das komplette Video noch einmal mit Verwischen (12-20) verketten, sodass ich ein 60-Sekunden-Video statt eines 30-Sekunden-Videos bekomme.
ffmpeg -y -i with_out_sound.mp4 -filter_complex [0:v]boxblur=10:enable='between(t,2,10)'[bg];[bg]crop=206:169:32:121[fg];[bg][fg]overlay=32:121:enable='between(t,2,10)'[tmp],[tmp]b oxblur=10:enable='between(t,12,20)'[tbg],[tmp]crop=206:169:42:100[tfg],[tbg][tfg]overlay=42:100:enable='between(t,12,20)'[tmp2] -map "[tmp2]" with_out_soundd.mp4
In diesem Fall erhalte ich jedoch die Fehlermeldung „Stream-Spezifizierer ‚tmp‘ in der Filtergraph-Beschreibung stimmt mit keinem Stream überein.“
Ich verwende die neueste Version von ffmpeg unter Windows.
Antwort1
Verwenden
ffmpeg -y -i with_out_sound.mp4 -filter_complex \
"[0:v]boxblur=10:enable='if(between(t,2,10)+between(t,12,20),1,0)'[bg];
[0:v]crop=206:169:32:121[fg1];[0:v]crop=206:169:42:100[fg2];
[bg][fg1]overlay=32:121:enable='between(t,2,10)'[tmp];
[tmp][fg2]overlay=42:100:enable='between(t,12,20)'[tmp2]"
-map [tmp2] with_blur.mp4
Du kannsthinzufügenmehrere Bedingungen, um die Unschärfe in einer Filterausführung durchzuführen, und dann zwei Overlays verwenden. Die Verkettung wird vermieden. Wenn Sie die Verkettung verwenden möchten, sollten Sie die beiden Streams trimmen, aber das ist einfacher.
Die verwendete Bedingung ist die if(x,y,z)
, die ausgewertet wird x
und zurückgibt y
, wenn sie wahr ist, andernfalls z
.