Ich möchte ein bewegtes Bild zuschneiden. Der Zuschnitt muss sich mit der Zeit bewegen, um einen Translationseffekt zu erzielen. Ich habe es mit folgendem Befehl versucht:
ffmpeg -y -i video.mp4 -filter_complex "movie=filename=image.jpg:loop=1[pip:v];[pip:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)'[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4
Aber der Zuschnitt bleibt unverändert. Ich glaube, der Zuschnitt-Zeitstempel funktioniert nicht, weil es sich um ein Bild handelt. Ich kann die Lösung nicht finden, können Sie mir helfen?
Antwort1
Anstatt den movie
Filter zu verwenden, können Sie image.jpg
als zweiten Input Folgendes hinzufügen und -r
zum Einstellen der Bildrate hinzufügen:
ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg...
Es definiert die Bildrate (Wiederholungsrate) von image.jpg
und löst das Zeitstempelproblem.
Aktualisierte Befehlszeile:
ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg -filter_complex "[1:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)':format=yuv444[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4