Ich habe nach einer Möglichkeit gesucht, ffmpeg zu verwenden, um einige MPEG-4-Videodateien (Basismedien / Version 2) herunterzuskalieren, die mit einer variablen Bildrate aufgezeichnet wurden, und Ein-/Ausblendeffekte am Anfang und Ende jedes Clips hinzuzufügen.
Basierend auf der hier gegebenen Antwort habe ich die folgende Befehlszeile verwendet, um meinen Clips einen 2-Sekunden-Fade/Out-Effekt hinzuzufügen:
ffmpeg -i VID_1.mp4 -sseof -2 -copyts -i VID_1.mp4 -lavfi "[1]fade=out:s=0:d=2[tail];[0][tail]overlay,fade=in:s=0:d=2[overlay]; anullsrc,atrim=0:4[audiotail];[0][audiotail]acrossfade=d=2,afade=d=2[audio];[overlay]scale=640:-1[video]" -map "[video]" -map "[audio]" -vsync 2 -sws_flags gauss -c:v libx264 -crf 18 -preset slow -shortest -report -hide_banner VID_1_out.mp4
Meine Fragen:
cur_dts is invalid (this is harmless if it occurs once at the start per stream)
Es ist normal?
Im resultierenden Ausgabevideoclip dauert die Einblendung weniger als 2 Sekunden (ca. 1 Sekunde) und es erscheint keine Ausblendung, sondern nur ein Blackout für die letzten vier Sekunden. Wo ist meine Befehlszeile falsch?
Die Dauer des Originalclips beträgt 24s640ms, die Ausgabedatei ist um 2s022ms länger. Warum zusätzliche 22 ms?
Wenn ich die -vsync 2
Option lösche, wird die Bildrate des Ausgabeclips genau die gleiche wie die der Quellvideodatei. Dies beseitigt jedoch nicht die oben genannten Probleme.
Das funktioniert hier
ffmpeg -i VID_1.mp4 -sseof -2 -copyts -i VID_1.mp4 -lavfi "[1]fade=out:s=1:d=2[tail];[0][tail]overlay,fade=in:s=0:d=2,scale=640:-2[video];anullsrc,atrim=0:2.1[audiotail];[0][audiotail]acrossfade=d=2,afade=d=2[audio]" -map "[video]" -map "[audio]" -vsync 2 -sws_flags gauss -c:v libx264 -crf 18 -preset slow -shortest -report VID_1_out.mp4
Bei einigen Videos, normalerweise solchen mit variablen FPS, funktioniert der Fade-Filter nur mit einem Startbild ungleich Null. Außerdem muss anullsrc nur geringfügig größer als die Crossfade-Dauer sein.
Gyan
USIKPA
Gyan
USIKPA
USIKPA