
Ich habe ein 30-sekündiges 240fps-Video von meiner GoPro Hero10. Jetzt möchte ich daraus eine „Zeitlupe“ machen, die 1/4 der Geschwindigkeit haben sollte. Die Ausgabe wäre also 2 Minuten bei 60fps. (Der Ton sollte ebenfalls konvertiert werden – ich weiß, dass dies diese tiefe Tonhöhe ergibt, das ist ok)
Nach einigen Recherchen bin ich zu folgendem Ergebnis gekommen:
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" output-0.25.mp4
Aber nachdem ich es überprüft habe ffmpeg -i output-0.25.mp4
, sehe ich, dass die FPS immer noch bei 240 liegt (obwohl die Länge korrekt ist, es Zeitlupe ist und der Ton ok, aber die Dateigröße recht groß ist und - wie gesagt - zu viele FPS für die Wiedergabe auf dem Zielgerät hat).
Also habe ich noch einmal gesucht und bin zum Hinzufügen gekommen, -r 60
sodass ich am Ende Folgendes erhalten habe:
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" -r 60 output-0.25.mp4
Jetzt zeigt der Check auch die richtigen fps an, aber es scheint "weniger Zeitlupe" zu sein und der Ton ist kratzig.
Was muss ich tun?
Alles was ich will ist„Nimm alle Originalbilder und packe sie in eine Datei, die mit ‚normaler Geschwindigkeit‘ abgespielt wird“.
Antwort1
Es gibt den Setpts-Modus und den Konvertierungsmodus in Raw.
Die Verwendung von setpts würde etwa so aussehen:
ffmpeg input.mkv -map_metadata -1 -filter_complex "[0:v:0]setpts=PTS*4[v];[0:a:0]atempo=0.5,atempo=0.5[a]" -map [v] -map [a] -c:v libx265 -vtag hvc1 -c:a libmp3lame -shortest "output.mp4"
- Verwenden Sie einen guten Codec, der die Dateigröße reduziert, wie H.265 (libx265).
- Ich vermute, dass das Ergebnisvideo zwar 240 FPS anzeigt, aber tatsächlich 60 FPS hat, weil die Metadaten des Videos 240 FPS anzeigen und diese Metadaten bei der Konvertierung nicht gelöscht werden. Die Option -map_metadata -1 würde die Metadaten entfernen.
Die Verwendung der Konvertierung in den RAW-Modus würde etwa so aussehen:
In diesem Beispiel gehe ich davon aus, dass das Originalvideo den H.264-Codec hat:
ffmpeg -i input.mp4 -map 0:v -c:v copy -bsf:v h264_mp4toannexb raw.h264
ffmpeg -fflags +genpts -r 60 -i "raw.h264" -i input.mp4 -map 0:v -map 1:a -filter:a "atempo=0.5,atempo=0.5" -c:v libx265 -vtag hvc1 "output.mp4"
Im ersten Befehl wird das Originalvideo in RAW konvertiert, im zweiten Befehl werden neue Zeitstempel generiert, wodurch das Video viermal langsamer abgespielt wird, der Ton des Originalvideos zum RAW-Video hinzugefügt wird, die Audiogeschwindigkeit viermal reduziert wird und schließlich das RAW-Video für eine kleinere Dateigröße in H.265 konvertiert wird.
Antwort2
Hier ist eine Lösung ohne erneute Kodierung des Videos:
- Extrahieren Sie den Videostream in einen HEVC (H.265)-„Rohvideostream“:
ffmpeg -y -an -i testfile.mp4 -c copy input_video.h265
- Ändern Sie dies mithilfe des Bitstream-Filters
tick_rate
in60
„Ticks pro Sekunde“ :hevc_metadata
ffmpeg -y -i input_video.h265 -c copy -bsf:v hevc_metadata=tick_rate=60:num_ticks_poc_diff_one=1 input_video2.h265
input_video2.h265
Mit dem „verlangsamten“ Audio zusammenführen :
ffmpeg -y -i input_video2.h265 -vn -i testfile.mp4 -map_metadata -1 -af "atempo=0.5,atempo=0.5" -c:v copy -vtag hvc1 -c:a aac -shortest "output.mp4"
Der „verlangsamte“ Ton klingt seltsam, aber ich finde keine bessere Lösung als die atempo
zweimalige Verwendung.