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!).
video
ffmpeg
compression
framerate
Mark Gerolimatos
quelle
quelle
Antworten:
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
-vsync
Option. Sie können einige verschiedene Optionen einstellen, aber die gewünschte ist '2' odervfr
. Von der Manpage: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 2
Option mit der-r $maxfps
Option kombinieren , wobei Sie natürlich durch$maxfps
die 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 $maxfps
bewirkt es anscheinend nur, dass Frames dupliziert / gelöscht werden, um eine konstante Framerate zu erzielen, und-vsync 2
es 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 $maxfps
dies 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.
quelle
-copyts
kann auch hilfreich seinNach 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
quelle