Konvertieren Sie ein 30 Sekunden langes Video mit 240 fps mit ffmpeg in ein 2 Minuten langes Video mit 60 fps

Konvertieren Sie ein 30 Sekunden langes Video mit 240 fps mit ffmpeg in ein 2 Minuten langes Video mit 60 fps

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 60sodass 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_ratein 60„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.h265Mit 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 atempozweimalige Verwendung.

verwandte Informationen