FFMPEG / libx264: Wie spezifiziere ich eine variable Bildrate mit einem Maximum?

16

Anstatt eine feste Bildrate für FFMPEG / libx264 (-r / -framerate) bereitzustellen, möchte ich eine variable Bildrate mit einem MAXIMUM-Wert angeben und libx264 erlauben, die Bildrate nach Belieben zu verringern. Die Idee dabei ist , zusätzliche Kompression zu erhalten , wenn es so etwas wie ein längeres Standbild ist (das geschieht VIEL in meinen Quellvideo).

Mir ist klar, dass ein prädiktiver oder bidirektionaler MPEG-Frame sehr gut komprimiert werden kann, aber es ist auch möglich, dass die Quell-Frame-Rate kleiner ist als die, in die ich transkodieren möchte (was möglicherweise zu einem BIGGER-Stream führt!).

Mark Gerolimatos
quelle
1
Wo (oder wie) weisen Sie x264 selbst an, VFR zu verwenden?
Slhck
Das ist meine frage
Mark Gerolimatos
2
Ihre Frage war, wie man VFR mit einem Maximum spezifiziert . Ich kenne nicht einmal eine Möglichkeit, die VFR-Codierung mithilfe von x264 festzulegen. (Ich spreche an dieser Stelle auch nicht über ffmpeg, da es sich um eine weitere Ebene zwischen Ihrer Quelle und x264 handelt.)
slhck
@MarkGerolimatos Hast du deine Antwort gefunden ?!
Dr.jacky
Nein, habe ich nie getan.
Mark Gerolimatos

Antworten:

19

Frustriert , dass Sie eine Antwort entweder nicht gefunden hatte, war ich auf Antwort zumindest gehen anderer Leute Fragen darüber , wie VFR ermöglichen (nicht V B R) , ausgegeben von FFMPEG.

Die Antwort darauf ist die seltsam benannte -vsyncOption. Sie können einige verschiedene Optionen einstellen, aber die gewünschte ist '2' oder vfr. Von der Manpage:

-vsync parameter Videosynchronisationsmethode
. Aus Kompatibilitätsgründen können alte Werte als Zahlen angegeben werden. Neu hinzugefügte Werte müssen immer als Zeichenfolgen angegeben werden.

  • 0, Passthrough

    • Jeder Frame wird mit seinem Zeitstempel vom Demuxer an den Muxer übergeben.
  • 1, vgl

    • Frames werden dupliziert und gelöscht, um genau die angeforderte konstante Framerate zu erreichen.
  • 2, vfr

    • Frames werden mit ihrem Zeitstempel durchlaufen oder gelöscht, um zu verhindern, dass 2 Frames denselben Zeitstempel haben.
  • fallen

    • Beim Passthrough werden jedoch alle Zeitstempel zerstört, sodass der Muxer basierend auf der Bildrate neue Zeitstempel generiert.
  • -1, auto

    • Wählt zwischen 1 und 2, abhängig von den Muxer-Fähigkeiten. Dies ist die Standardmethode.

Beachten Sie, dass die Zeitstempel danach vom Muxer weiter modifiziert werden können. Zum Beispiel für den Fall, dass die Formatoption avoid_negative_ts aktiviert ist.

Mit -map können Sie auswählen, aus welchem ​​Stream die Zeitstempel entnommen werden sollen. Sie können entweder Video oder Audio unverändert lassen und die verbleibenden Streams mit dem unveränderten synchronisieren.

Ich habe jedoch nicht genug Reputation, um einen Kommentar zu schreiben, um nur diese "Unterfrage" zu beantworten, die jeder zu haben scheint. Aber ich hatte ein paar Ideen, von denen ich ehrlich gesagt nicht sehr optimistisch war ... Aber die erste, die ich ausprobierte, funktionierte tatsächlich . So.

Sie müssen nur die -vsync 2Option mit der -r $maxfpsOption kombinieren , wobei Sie natürlich durch $maxfpsdie gewünschte maximale Bildrate ersetzen ! Und es funktioniert! Es werden keine Frames aus einer Quelldatei dupliziert, aber es werden Frames gelöscht, die dazu führen, dass die Datei die maximale Framerate überschreitet!

Standardmäßig -r $maxfpsbewirkt es anscheinend nur, dass Frames dupliziert / gelöscht werden, um eine konstante Framerate zu erzielen, und -vsync 2es bewirkt von sich aus, dass Frames direkt eingezogen werden, ohne die PTS-Werte wirklich zu beeinflussen.

Ich war diesbezüglich nicht optimistisch, weil ich bereits wusste, dass -r $maxfpsdies eine konstante Framerate darstellt. Ich habe ehrlich gesagt erwartet, dass ein Fehler vorliegt oder dass er einfach gehorcht, je nachdem, was zuerst oder zuletzt auftrat oder was auch immer. Die Tatsache, dass es genau das tut, was ich wollte, freut mich sehr über die FFMPEG-Entwickler.

Ich hoffe, das hilft dir oder jemand anderem später, wenn du das nicht mehr wissen musst.

Tynach
quelle
3
-copytskann auch hilfreich sein
Rogerdpack
1

Ich möchte eine variable Framerate mit einem MAXIMUM-Wert angeben und libx264 erlauben, die Framerate nach Belieben zu verringern. Die Idee dabei ist, eine zusätzliche Komprimierung zu erhalten, wenn es so etwas wie ein erweitertes Standbild gibt

Nach meinem Verständnis ist dies möglicherweise vergleichsweise umständlich, jedoch aus komplexen und nicht intuitiven Gründen unerwünscht

Obwohl ein x264-Stream eine Framerate aufweist, ist die Framerate eher ein Problem auf Containerebene als ein Codec-Problem.

In einer Passthrough-VFR-Codierung gibt es im Wesentlichen eine Textdatei, die angibt, wie hoch die Framerate über welche Frames / Zeiten ist, und bei der Codierung einer Quelle leitet eine Funktion wie tcfile-in oder tcfile-out die Zeitstempel an die Codierung weiter , um die Positionen der Raten abzubilden und das Video subjektiv von der Quelle konsistent zu halten.

Die Idee einer niedrigen Framerate 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, mit der die Bildrate in Bezug auf die Bewegung variiert werden kann, um die Dateigröße zu verringern (analog zu den vielen Bitratensteuerelementen).

Die Quelle ist auch ein Problem: VFR-Quellen behalten standardmäßig ihre Frame-Variabilität bei, aber das Codieren einer CFR-Datei mit variabler Bitrate (eine gute Idee, besonders wenn Telecine benötigt wird) wird einfach den gleichen CFR erzeugen.

Dies bedeutet, dass Sie wahrscheinlich die Bitrate von Hand neu schreiben müssen (dh Zeitstempel langsamer Szenen, die in die Datei gemuxt werden), oder für avisynth auf einen Frame-Dezimierungsalgorithmus wie dup, dedup und exactDedup zurückgreifen müssen . Wenn Ihr Video extrem wenig Bewegung hat, werden einige Frames (sogar die Hälfte?) Ausgeworfen. Das Problem ist, dass diese Algorithmen nicht weiterentwickelt sind und mit "realem" Filmmaterial keine gute Wahl treffen, was zur besten Codierung beiträgt.

Das Entfernen von Frames, die Elemente wie I- und B-Frames enthalten, verringert im Laufe der Zeit die Menge der verfügbaren Details, was dazu führt, dass Bewegungen "schrittweise" aussehen und die anderen grundlegenden Videoparameter stören und Artefakte wie Aliasing verursachen können.

Und aufgrund der Funktionsweise der Quantisierer wird x264 die Bitrate in diesen bewegungsarmen Szenen überproportional weiter verringern. Wenn Sie keine Diashow mit identischen Bildern haben, kommt es zu Bewegungen (wenn nur Körnung und andere Artefakte) und zu einem Qualitätsverlust, der ohne drastische Änderungen der Bitrate nicht zu sehen wäre.

Und schließlich gibt es nicht viele Optionen, um das zu tun, was Sie wollen, weil x264 wirklich gut darin ist, die Bitrate nur mit zeitlicher Komprimierung zu verwalten (Änderungen in Teilbildern aufzeichnen). Wenn Sie zu 1/2 Framerate wechseln, wird die Dateigröße nicht halbiert. 10% sind wahrscheinlich ein realistischer Gewinn, den Sie von geringen Bewegungen oder Animationen erwarten können.

Kurz gesagt, das Verringern der Bitrate Ihrer statischen Szenen hat nur eine geringe Auswirkung auf Ihre Dateigröße, führt jedoch 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 möglicherweise die maximale neue Bildrate mithilfe der Stufenoptionen begrenzen , die jeweils eine maximale Auflösung und Bildrate festlegen. Leider müssten Sie wahrscheinlich mit sehr niedrigen Auflösungen arbeiten, um die gewünschten Bildraten mithilfe von Profilen zu erhalten. Es wird darauf zurückgegriffen, die Raten entweder vollständig von Hand zu bearbeiten oder die Bildraten zu korrigieren, die Sie für zu hoch halten. In beiden Fällen ist Jonglieren erforderlich, um den Sound mit den neuen Frameraten synchron zu halten, wenn Änderungen nach dem Kodierungsprozess vorgenommen werden, wenn die tc-Datei erhalten bleibt.

Der Vorteil ist, dass die Optimierung der vielen Bitrateneinstellungen viel mehr Zeit für die Verwaltung der Dateigröße und die Verbesserung der Videoqualität bedeutet, als Komplikationen bei geringem Gewinn zu verursachen. Es ist wahrscheinlich die beste Idee, den ursprünglichen FPS beizubehalten, es sei denn, Sie streben nach Broadcast- oder Medienstandards. Player können (im Gegensatz zu Editoren) variable Bitraten wiedergeben. Je mehr Frames in Ihrem Video vorhanden sind, desto flüssiger ist die Wiedergabe und desto kleiner ist möglicherweise die Dateigröße, da sich die Bewegungen zwischen den Frames geringfügig ändern.

Hier ist eine Sammlung von Links zu Standardinformationen und Forumsdiskussionen, die bei diesem verwirrenden Aspekt der Codierung helfen sollten:

- avisynth Dezimationswerkzeuge

- fps und -r Schalter
- x264 Allgemein (tcfile, fps)
- Timecode- Dateistandards
- Ebenen und Profile
- Kurze, klare Zusammenfassung der CFR / VFR-Einstellungen (Abschnitt "Framerate")

doom9, videohelp & c theoretische diskussionen
1 2 3 4 5 6 7

chronometrisch
quelle