Ändern Sie die Bildrate eines MP4-Videos mit ffmpeg

8

Ich habe ein Video im MP4-Format mit einer Bildrate von .33(1 Bild für 3 Sekunden). Ich möchte die Bildrate auf 5 Bilder / Sek. Erhöhen. Ich habe den folgenden Befehl ausprobiert, aber er macht nichts:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Irgendeine Idee, warum ffmpeg die -rOption ignoriert ?

Feueraffe
quelle
Wenn Sie versuchen , ein Video zu beschleunigen / verlangsamen, anstelle von doppeltem / Drop - Frames, siehe superuser.com/questions/854753/... und / oder askubuntu.com/questions/370692/...
Peter Cordes

Antworten:

7

Ich weiß, dass dies eine alte Frage ist, aber keine der aktuellen Antworten ist mehr der empfohlene Weg.

Verlustfreies (Video-) Remuxing

Wie in den Kommentaren erwähnt, gibt es eine Möglichkeit, dies zu tun, wenn das Video nicht neu codiert werden muss. Es erfordert das Remuxen der Datei in ein anderes Containter-Format MKV und das anschließende Remuxen in ein MP4. Hier ist ein Beispiel, das ein Video auf 12 Bilder / Sekunde ändert:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Wenn das Video Audio enthält, können Sie dies auch verlangsamen, ohne die Tonhöhe zu ändern. Dies ist jedoch keine verlustfreie Konvertierung. Im folgenden Beispiel wird davon ausgegangen, dass das Quellvideo 24 Bilder / Sekunde betrug, sodass das Audio mit dem atempo- Filter von ffmpeg auf die halbe (0,5) Geschwindigkeit verlangsamt werden musste.

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

FFMPEG Wiki-Anleitung

Dies ist die Anleitung aus dem ffmpeg-Wiki . Beachten Sie, dass für alle diese Optionen das Video neu codiert werden muss.

Video beschleunigen / verlangsamen

Sie können die Geschwindigkeit eines Videostreams mithilfe des Setpts-Videofilters ändern. Beachten Sie, dass in den folgenden Beispielen der Audiostream nicht geändert wird. Daher sollte er idealerweise mit -an deaktiviert werden.

Um die Geschwindigkeit des Videos zu verdoppeln, können Sie Folgendes verwenden:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Der Filter ändert den Präsentationszeitstempel (PTS) jedes Videobilders. Wenn beispielsweise zwei aufeinanderfolgende Frames bei den Zeitstempeln 1 und 2 angezeigt werden und Sie das Video beschleunigen möchten, müssen diese Zeitstempel 0,5 bzw. 1 werden. Wir müssen sie also mit 0,5 multiplizieren.

Beachten Sie, dass bei dieser Methode Frames gelöscht werden, um die gewünschte Geschwindigkeit zu erreichen. Sie können verworfene Frames vermeiden, indem Sie eine höhere Ausgabe-Framerate als die Eingabe angeben. Um beispielsweise von einem Eingang mit 4 FPS zu einem Eingang mit einer Geschwindigkeit von bis zu 4x (16 FPS) zu wechseln:

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Um Ihr Video zu verlangsamen, müssen Sie einen Multiplikator größer als 1 verwenden:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Glatt

Mit dem Minterpolate-Videofilter können Sie langsame / schnelle Videos glätten. Dies ist auch als "Bewegungsinterpolation" oder "optischer Fluss" bekannt.

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Weitere Optionen sind slowmoVideo und Butterflow. Audio beschleunigen / verlangsamen

Mit dem atempo-Audiofilter können Sie Audio beschleunigen oder verlangsamen. So verdoppeln Sie die Audiogeschwindigkeit:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Der atempo-Filter kann nur Werte zwischen 0,5 und 2,0 verwenden (daher kann er auf nicht weniger als die Hälfte der ursprünglichen Geschwindigkeit und auf nicht mehr als das Doppelte der Eingabe verlangsamen). Wenn nötig, können Sie diese Einschränkung umgehen, indem Sie mehrere atempo-Filter aneinanderreihen. Folgendes vervierfacht die Audiogeschwindigkeit:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Mit einem komplexen Filtergraphen können Sie Video und Audio gleichzeitig beschleunigen:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
pseudosavant
quelle
1
Es ist möglich, durch einfaches Remuxen zu beschleunigen / verlangsamen, aber FFmpeg weiß nicht, wie es geht . zB für mkv kann mkvtoolnix das. zB mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv Framerate am MKV-Container ändern . Sie können zu MKV und zurück zu MP4 remuxen oder ein Tool finden, das dies direkt für MP4 erledigt. Das xcodieren des Videos ist sehr CPU-intensiv und verlustbehaftet, daher ist es eine schreckliche Option.
Peter Cordes
Völlig einverstanden, dass das Remuxen auf eine niedrigere Framerate bevorzugt wird, da es sich um einen verlustfreien Ansatz handelt, der viel weniger ressourcenintensiv ist. In der Praxis habe ich jedoch keine guten Werkzeuge gefunden, um dies mit MP4s zu tun. Ich habe es in letzter Zeit nicht wirklich versucht, aber als ich diese Antwort zum ersten Mal schrieb, hatte ich MP4-> MKV-> MP4-Remuxing und konnte es mit mkvtoolnix, ffmpeg und / oder mp4box nicht zum Laufen bringen. Ich muss es mit den von Ihnen vorgeschlagenen Parametern versuchen.
Pseudosavant
6

Wenn die Eingabedatei keine gültige Bildrate hat, müssen Sie sie möglicherweise explizit festlegen

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Martin Beckett
quelle
Dies transkodiert, wenn Sie wirklich nur Remux benötigen. (Es sei denn, Sie möchten tatsächlich Bilder duplizieren / löschen, anstatt das Video zu verlangsamen / zu beschleunigen.)
Peter Cordes
3

Ich konnte die geänderte Bildrate nur dann wirksam werden lassen, wenn die Eingabedatei als "Rohdatei" klassifiziert wurde:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Ohne Angabe -f h264würde standardmäßig 25 fps verwendet und es könnte nicht geändert werden. Anscheinend lag dies daran, dass dem Stream überhaupt keine Framerateninformationen fehlten und dies die Standard-Framerate von ffmpeg ist.

Wenn Sie -rals Ausgabeoption verwenden, werden anscheinend Frames dupliziert oder gelöscht, sodass das Video mit der gleichen Geschwindigkeit abgespielt wird - in diesem Fall nicht das, was Sie wollen! Wenn Sie jedoch die Framerate des Eingangs wie oben ändern, wird das Video beschleunigt oder verlangsamt, ohne dass Frames verloren gehen oder dupliziert werden.

Malvineous
quelle
1
Meine nützliche Antwort. Keine
Neukodierung
1

Ein solches Merkmal - das Ändern der Framerate - wird als "konform" bezeichnet und wird häufig verwendet, um Zeitlupe oder Schnellvorlauf zu erzeugen, wie das Wachstum einer Pflanze in Minuten innerhalb von Tagen. ffmpeg erlaubt kein Überschreiben / Ändern der Framerate ohne Neucodierung . In diesem Fall ändert sich die Dauer und der Ton ist nicht synchron, sofern er nicht separat repariert wird. Ich befürchte jedoch, dass Audio in Ihrem Fall mit einer Bildrate von 0,33 nicht von Interesse ist

Sie möchten sich anpassen, weil Sie nur die Framerate ändern möchten, aber ffmpeg ignoriert dies -rstillschweigendwenn die Framerate in der Eingabedatei angegeben ist. Da Ihre Eingabedatei im MP4-Format vorliegt, hat die eigene Framerate Vorrang vor-rwenn keine Neucodierung erforderlich ist. Dafür benötigen Sie ein anderes Werkzeug: Mencoder.

Angenommen, Ihre Eingabedatei enthält keinen Ton - wahrscheinlich für jedes Video mit einer Bildrate von 0,33 -, benötigen Sie Folgendes:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Beachten Sie, dass Mencoder standardmäßig eine Ausgabe im AVI-Format erzeugen.

Tankman 六四
quelle
1
Das ist falsch. Wenn rals Ausgangsschalter angegeben, erzeugt ffmpeg unabhängig von der Framerate des Eingangs eine Ausgabe mit der angegebenen Framerate. Wenn rals Eingangsschalter angegeben, dupliziert oder löscht ffmpeg Frames nach Bedarf, um die angegebene Anzahl von Frames pro Sekunde des Eingangs dem Filter / Encoder zuzuführen.
Gyan
Das Verhalten, das Sie beschreiben, wenn res sich um einen Eingabeschalter handelt, widerspricht meinem früheren Experiment zum MP4-Format, dem Hinweis von Malvineous (auf dieser Seite) und der Fehlerbeschreibung 403 trac.ffmpeg.org/ticket/403 ; Ihre Beschreibung, wann rsie für die Ausgabe verwendet wird, erfolgt bei der Neucodierung, während das OP-Szenario aufgrund der Tatsache, dass er eine Framerate von 0,33 hatte, ein konformer Fall zu sein scheint (Framerate ohne Neucodierung korrigieren).
Tankman
1
Überprüfen Sie den hier eingefügten Bericht . Beachten Sie die Befehlszeile oben, die Eingabe- und Ausgabemetadaten und schließlich die Nr. von Frames codiert.
Gyan
1
Einverstanden, dass das OP nur die Datei anpassen möchte, der angegebene Befehl jedoch neu codiert wird, da keine Kopierschalter angegeben sind. In diesem Szenario sollte ffmpeg einen neuen Stream mit rfps generieren .
Gyan
Vielen Dank an Mulvya für die überzeugende Beispielausgabe. Ja, Sie haben Recht mit der Verwendung von -r. Diese Verwendung konnte meine früheren Experimente als Reaktion auf OP nicht beeinflussen, da ich in einem konformen Fall den Kopierparameter nie aus ffmpeg entfernt habe und -rdaher ignoriert werde. Ich schrieb eine Feature-Anfrage: trac.ffmpeg.org/ticket/5170
Tankman
0

Am schnellsten erstellen Sie eine BAT-Datei im Verzeichnis mit den folgenden Zeilen:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Sie müssen mkvmerge und ffmpeg im selben Verzeichnis haben. Es ändert jede mp4-Datei in Sekunden automatisch ohne Qualitätsverlust.

Peder Gerdin
quelle