variabler%20Framerate.png)
Anstatt FFMPEG/libx264 eine feste Bildrate bereitzustellen (-r/-framerate), möchte ich eine variable Bildrate mit einem MAXIMALEN Wert angeben und libx264 erlauben, die Bildrate nach eigenem Ermessen zu verringern. Die Idee dabei ist, eine zusätzliche Komprimierung zu erreichen, wenn es so etwas wie ein erweitertes Standbild gibt (was passiertEINE MENGEin meinen Quellvideos).
Mir ist bewusst, dass sich ein prädiktiver oder bidirektionaler MPEG-Frame sehr gut komprimieren lässt, es ist jedoch auch möglich, dass die Quell-Framerate kleiner ist als die, in die ich transkodieren möchte (was möglicherweise zu einem GRÖSSEREN Stream führt!).
Antwort1
Frustriert, dass Sie auch keine Antwort gefunden haben, wollte ich zumindest die Fragen anderer Leute beantworten, wie man VFR aktiviert (nicht VBR) Ausgabe von FFMPEG.
Die Antwort darauf ist die seltsam benannte -vsync
Option. Sie können sie auf verschiedene Optionen setzen, aber die gewünschte ist „2“ oder vfr
. Aus der Manpage:
-vsync Parameter
Methode zur Videosynchronisierung. Aus Kompatibilitätsgründen können alte Werte als Zahlen angegeben werden. Neu hinzugefügte Werte müssen immer als Zeichenfolgen angegeben werden.
0, Durchgang
- Jeder Frame wird mit seinem Zeitstempel vom Demuxer an den Muxer übergeben.
1, siehe
- Um genau die angeforderte konstante Bildrate zu erreichen, werden Frames dupliziert und gelöscht.
2, vfr
- Frames werden mit ihrem Zeitstempel durchgelassen oder gelöscht, um zu verhindern, dass zwei Frames den gleichen Zeitstempel haben.
fallen
- Wie Passthrough, zerstört aber alle Zeitstempel, sodass der Multiplexer basierend auf der Bildrate neue Zeitstempel generiert.
-1, auto
- Wählt je nach Multiplexer-Fähigkeiten zwischen 1 und 2. Dies ist die Standardmethode.
Beachten Sie, dass die Zeitstempel danach vom Muxer weiter geändert werden können. Wenn beispielsweise die Formatoptionnegative_ts_vermeidenaktiviert.
Mit -map können Sie auswählen, von welchem Stream die Zeitstempel übernommen werden sollen. Sie können entweder Video oder Audio unverändert lassen und die verbleibenden Streams mit dem unveränderten Stream synchronisieren.
Allerdings habe ich nicht genug Ansehen, um einen Kommentar zu posten, der nur diese „Unterfrage“ beantwortet, die sich anscheinend jeder stellt. Aber ich hatte ein paar Ideen, bei denen ich ehrlich gesagt nicht sehr optimistisch war... Aber die erste, die ich ausprobiert habe, war eigentlichhat funktioniert. Also.
-vsync 2
Sie müssen lediglich die Option mit der Option kombinieren -r $maxfps
und diese natürlich durch $maxfps
die gewünschte maximale Framerate ersetzen! Und es FUNKTIONIERT! Es dupliziert keine Frames aus einer Quelldatei, aber es werden Frames gelöscht, die dazu führen, dass die Datei die maximale Framerate überschreitet!
Standardmäßig scheint dies -r $maxfps
allein dazu zu führen, dass Frames dupliziert/verworfen werden, um eine konstante Framerate zu erreichen, und -vsync 2
allein dazu, dass die Frames direkt eingezogen werden, ohne die PTS-Werte wirklich zu beeinflussen.
Ich war diesbezüglich nicht optimistisch, weil ich bereits wusste, dass -r $maxfps
es dadurch eine konstante Bildrate erhält. Ich habe ehrlich gesagt einen Fehler erwartet oder dass es einfach dem gehorcht, was zuerst oder zuletzt oder was auch immer eintritt. Die Tatsache, dass es genau das tut, was ich wollte, lässt mich mit den FFMPEG-Entwicklern ziemlich zufrieden sein.
Ich hoffe, dass dies Ihnen oder später jemand anderem hilft, wenn Sie dies nicht mehr wissen müssen.
Antwort2
Ich möchte eine variable Bildrate mit einem MAXIMALEN Wert angeben und libx264 erlauben, die Bildrate nach eigenem Ermessen zu verringern. Die Idee dabei ist, eine zusätzliche Komprimierung zu erreichen, wenn es so etwas wie ein erweitertes Standbild gibt.
Nach meinem Verständnis ist dies zwar auf vergleichsweise umständliche Weise möglich, aber aus einigen komplexen und kontraintuitiven Gründen unerwünscht.
Auch wenn ein x264-Stream eine oder mehrere Bildraten hat, handelt es sich bei der Bildrate eher um ein Problem auf Containerebene als auf Codec-Ebene.
Bei einer Passthrough-VFR-Kodierung gibt es im Wesentlichen eine Textdatei, in der die Bildrate über welche Bilder/Zeiten detailliert angegeben ist, und bei der Kodierung einer Quelle gibt eine Funktion wie „tcfile-in“ oder „tcfile-out“ die Zeitstempel an die Kodierung weiter, um die Ratenstandorte zuzuordnen und die subjektive Konsistenz des Videos zur Quelle zu wahren.
Die Idee mit der niedrigen Bildrate ist logisch, funktioniert aber aus mehreren Gründen nicht. Obwohl x264 mit einigen Funktionen VFR-fähig ist, glaube ich nicht, dass es eine Analysefunktion gibt, die die Bildrate in Bezug auf die Bewegung variiert, um die Dateigröße zu verringern (in gewisser Weise analog zu den vielen Bitrate-Steuerelementen).
Auch die Quelle stellt ein Problem dar: VFR-Quellen behalten standardmäßig ihre Frame-Variabilität bei, aber anscheinend führt das Kodieren einer CFR-Datei mit variabler Bitrate (manchmal eine gute Idee, insbesondere wenn Telecine erforderlich ist) einfach zum selben CFR.
Das bedeutet, dass Sie die Bitrate wahrscheinlich manuell neu schreiben müssen (also die Zeitstempel langsamer Szenen in die Datei einfügen) oder auf eineFrame-Dezimierungsalgorithmus wie Dup, Dedup und ExactDedup für Avisynth. Wenn Ihr Video wirklich sehr wenig Bewegung enthält, werden einige Frames (sogar die Hälfte?) weggeworfen. Das Problem ist, dass diese Algorithmen nicht ausgereift sind und bei „echtem“ Filmmaterial keine guten Entscheidungen darüber treffen, was zur besten Kodierung beiträgt.
Durch das Entfernen von Frames, die beispielsweise I- und B-Frames enthalten, wird außerdem die Menge der mit der Zeit verfügbaren Details reduziert, was dazu führt, dass die Bewegung „schrittweise“ aussieht, andere grundlegende Videoparameter beeinträchtigen und Artefakte wie Aliasing verursachen kann.
Und aufgrund der Funktionsweise der Quantisierer verringert x264 die Bitrate in diesen Szenen mit geringer Bewegung tatsächlich überproportional. Sofern Sie keine Diashow mit identischen Bildern haben, wird es Bewegung geben (und sei es nur Körnigkeit und andere Artefakte) und es kommt zu einem Qualitätsverlust, der ohne drastische Änderungen der Bitrate nicht sichtbar wäre.
Und schließlich besteht der Grund, warum es nicht viele Optionen gibt, um das zu tun, was Sie möchten, darin, dass x264 die Bitrate wirklich gut allein durch zeitliche Komprimierung (Aufzeichnen von Änderungen in Teilbildern) verwalten kann. Eine Reduzierung auf die halbe Bildrate halbiert die Dateigröße nicht; 10 % sind wahrscheinlich ein realistischer Gewinn, den man bei wenig Bewegung oder Animation erwarten kann.
Kurz gesagt: Eine Reduzierung der Bitrate Ihrer statischen Szenen wird sich kaum positiv auf die Dateigröße auswirken, führt aber zu einer Reihe von Qualitäts- und Synchronisierungsproblemen, ganz zu schweigen von der Inkompatibilität mit Videobearbeitungssoftware.
Wenn Sie einen Dezimator ausprobieren möchten, können Sie die maximale neue Bildfrequenz möglicherweise begrenzen, indem SieEbenenoptionen, die jeweils eine maximale Auflösung und Bildrate angeben. Leider müssen Sie wahrscheinlich mit sehr niedrigen Auflösungen arbeiten, um die gewünschten Bildraten mithilfe von Profilen zu erhalten. Sie müssen die Raten dann entweder vollständig manuell bearbeiten oder die Bildraten korrigieren, die Ihrer Meinung nach zu hoch sind. In jedem Fall müssen Sie ein wenig jonglieren, um den Ton mit den neuen Bildraten synchron zu halten, wenn nach dem Kodierungsprozess beim Speichern der TC-Datei Änderungen vorgenommen werden.
Das Fazit ist, dass Sie, wenn Sie Zeit in die Optimierung der vielen Bitrate-Einstellungen investieren, viel mehr bei der Verwaltung der Dateigröße erreichen und die Qualität Ihres Videos verbessern können, anstatt Komplikationen mit wenig Nutzen zu verursachen. Die Beibehaltung der ursprünglichen FPS ist wahrscheinlich die beste Idee, es sei denn, Sie streben Rundfunk- oder Medienstandards an. Player sind gut darauf ausgelegt, mit unterschiedlichen Bitraten umzugehen (im Gegensatz zu NLEs) – und je mehr Frames in Ihrem Video sind, desto flüssiger ist die Wiedergabe und möglicherweise desto kleiner ist die Dateigröße, da die Bewegungsänderungen zwischen den Frames kleiner sind.
Hier ist eine Sammlung von Links zu Informationen zu Standards und Forumsdiskussionen, die bei diesem verwirrenden Aspekt der Kodierung helfen sollten:
-fps- und -r-Schalter
-x264 Allgemein (tcfile, fps)
-Timecode-Dateistandards
-Ebenen und Profile
-Kurze, klare Zusammenfassung der CFR/VFR-Einstellungen (Abschnitt „Framerate“)
Doom9, Videohilfe und theoretische Diskussionen
1
2
3
4
5
6
7
Antwort3
Perfekte Lösung: Reduzieren Sie wiederholte sehr ähnliche Frames und speichern Sie die Ausgabe bei (Spitzen-)variabler Framerate
- Bei Inhalten mit langen Standbildern kann das Weglassen doppelter Frames die Framerate dynamisch und deutlich reduzieren und so eine stärkere Reduzierung der Dateigröße erreichen, als es der Codec und seine Intra-Frame-Komprimierung jemals schaffen könnten!
- In meinem Beispiel:
- 100 % ursprüngliche Mezzanine-Dateigröße bei 60 FPS
- 15 % CR28 bei konstanter Bildrate von 60 FPS
- 6 % CR28 bei 60 FPS Spitzenbildrate (fast ein Faktor von 3x!)
Original verfügbar
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 screen-recording-vfr.mp4
Transkodieren Sie bereits komprimiertes Videomaterial in eine dynamische Bildfrequenz, ohne es erneut zu kodieren.
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated-without-reencoding.mp4
Im Detail
Original verfügbar
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 "screen-recording-vfr.mp4"
-i video-mezzanine.mov Original or your high quality rendered export as the input file.
-movflags faststart Streaming ready by putting the moov atom to the file start.
-c:v libx264 H-264 codec
-vf mpdecimate Drop frames not differing greatly from previous frame to reduce frame rate.
-vsync vfr Output as variable frame rate (vfr)! Necessary sister option to 'mpdecimate'.
- To maintain the playback speed while benefitting from the file size reduction.
-r 30 If you specify -r then in this combo it serves as the peak framerate!
I recommend to omit this option:
- Then the peak framerate IS the peak/constant rate of the source.
- Which preserves dynamic scenes fully and compresses long still sequences.
- So the best of both aspects.
- State a peak FPS if loosing FPS in dynamic scenes
is acceptable for the reduction in file size.
-crf 24 - Constant Rate Factor (constant quality at variable bitrate)
-preset veryslow - Quality effort put into the encoding
screen-recording-vfr.mp4 - Output file
Konvertieren Sie bereits exportierte Videos ohne erneute Kodierung in eine dynamische Bildrate
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated.mp4
Dies ist ein verlustfreier Vorgang. Es erfolgt keine verlustbehaftete Neukodierung, sondern nur Neupacken/Neureferenzieren.
Es werden so viele doppelte Frames gelöscht wie möglich!
Beispiel:
Diashow mit nur 3 Standbildern ohne Übergänge * jedes dauert 5 Sekunden * bei 50 FPS = 750 Bilder
ffmpeg
wird es tatsächlich auf nur 3 Frames bei 1/5 (=0,2) FPS reduzieren! Mit Mediainfo bestätigt!
Analyse & Erkenntnisse
- Bei Videos mit langen Standbildszenen können die Bildanzahl und die Dateigröße erheblich reduziert werden!
- Für beide Szenarien
- Die Kodierung aus der Mezzanine-Datei mit demselben CFR behält die visuelle Qualität bei
- Die Dateigrößenreduzierung von einer konstanten zu einer variablen Bildrate beträgt jedoch 15 % bis 6 %.
- Eine Reduzierung der Bildrate ohne Neukodierung führt zwar zu einer geringeren Reduzierung der Dateigröße, aber dennoch:
- Reduziert die Dateigröße (15 % bis 10 %)
- Die Kodierung aus der Mezzanine-Datei mit demselben CFR behält die visuelle Qualität bei
screen-recording.mov
- Frame rate mode: Variable
- Frame rate: 58.628 FPS
- Minimum frame rate: 30.000 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 732 100 %
- Size: 1675084 bytes 100 %
screen-recording CR24 fps 60.mp4
- Frame rate mode: Constant
- Frame rate: 60.000 FPS
- Frame count: 750 102 %
- Size: 255863 bytes 15 %
screen-recording CR24 mpdecimated vfr.mp4
- Frame rate mode: Variable
- Frame rate: 17.398 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 214 29 %
- Size: 101860 bytes 6 %
screen-recording CR24 mpdecimated fps 30 max.mp4
- Frame rate mode: Variable
- Frame rate: 11.078 FPS
- Minimum frame rate: 1.154 FPS
- Maximum frame rate: 30.000 FPS
- Frame count: 137 17 %
- Size: 94382 bytes 5.6
screen-recording CR24 mpdecimated vfr without re-encoding faststart.mp4
- Frame rate mode: Variable
- Frame rate: 19.974 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 247 33 %
- Size: 165 KB (164947 bytes) 10 %