Minimale Arbeitsbildrate für H264-Codec

Wenn Sie ein Video aus einzelnen Bilddateien erstellen, wobei jede Bilddatei etwa eine Sekunde lang sichtbar sein sollte, ist es sinnvoll, ein Video mit einer extrem niedrigen Bildrate zu codieren, z. B. 1 Bild pro Sekunde. Für diese Art von Anwendung wäre jede höhere Framerate Ressourcenverschwendung.

Ich frage mich, ob der H264-Codec (oder eine bestimmte Implementierung wie x264) selbst eine Untergrenze für die Bildrate hat, unterhalb derer es zu technischen Problemen oder einer Art Instabilität kommt. Falls es kein Problem mit der Codierung gibt, können wir erwarten, dass Videoplayer mit einer so ungewöhnlich niedrigen Bildrate richtig umgehen?

Vielen Dank für das Teilen Ihrer Erfahrung!

Antworten (4)

Ich bin bei AJ. Wenn Sie nicht die Eigenschaften jedes Spielers kennen, der dies sehen könnte, wäre es unklug, sich auf eine kleine Stichprobe von Testergebnissen zu verlassen. Wenn Sie eine Standardbildrate wie 24 fps mit einem Keyframe-Intervall von 24 Bildern verwenden, erhalten Sie im Wesentlichen dasselbe ohne Kompromisse bei der Kompatibilität. Die Zwischenframes werden minimal klein sein, da keine erkennbaren Änderungen zu codieren sind.

Yup, ein bitidentischer Frame dauert nur etwa 15 Bytes. Alle Makroblöcke = überspringen, und CABAC komprimiert das wiederholte Bitmuster dafür sehr gut.
Ich würde mir jedoch nur Gedanken über Hardware-Player machen, die davon ausgehen, dass sie ein 60- oder 50-Hz-TV-Signal ausgeben. h.264 kümmert sich nicht um das Timing, es sind nur Frames, selbst in einem VFR-Video. Frame-Zeitstempel sind ein Containerproblem. Containerformate sind sehr flexibel. Es ist leicht möglich, einen einzelnen Frame für 1 Minute anzuzeigen, dann 150 fps für mehrere Frames, dann einen anderen Frame für eine Weile anzuzeigen oder alles, was Sie möchten. Das Speichern von VFR-Videos in mkv, mp4 und einigen anderen modernen Containern ist ein gelöstes Problem.

Ich bin mir nicht sicher, wie es sich bei sehr niedrigen Bildraten verhalten wird, aber es sei darauf hingewiesen, dass dies auch Ihre Möglichkeiten einschränken würde, wie und wann Sie Bilder wechseln könnten, da sie den Taktzyklen folgen müssten. Was in diesem Fall wahrscheinlicher funktioniert, ist ein langes Keyframe-Intervall. Die meisten Frames in einer Komprimierung wie H.264 speichern nur die Änderungen gegenüber dem vorherigen Frame. Im Fall eines Standbilds sind die Komprimierungsverhältnisse enorm, da zwischen den Einzelbildern nur sehr wenige (keine) Änderungen auftreten. Ich bin mir nicht sicher, ob Sie durch das Verringern der Bildrate wirklich genügend Einsparungen erzielen würden, um den Verlust der Kontrolle darüber, wann Sie eine Änderung am Bild vornehmen können, wert zu sein.

Am besten probieren Sie es mit Ihren Medien aus und sehen sich die Ergebnisse an. Die Komprimierung ist eine stark vom Inhalt abhängige Sache, und die beste Qualität und Komprimierung für einen bestimmten Clip hängt stark von der Art des Clips ab. Daher ist eine Testversion immer noch der beste Weg, es zu testen.

Es gibt einen Komprimierungsnachteil, der über das hinausgeht, was mein früherer Kommentar zu einer anderen Antwort gesagt hat: Wenn zwischen den verschiedenen Bildern viel Redundanz besteht (dh es ist immer noch ein Video, keine Diashow), erschwert das Auffüllen mit identischen Bildern das Auffinden und Auffüllen durch den Encoder das ausnutzen. Abhängig von den Codierungseinstellungen behält der Encoder nur eine gewisse Anzahl alter Frames als mögliche Referenzen für neue Frames und kann nur innerhalb einer GOP suchen (z. B. standardmäßig 250 Frames für x264). Wenn alle diese Kandidaten dasselbe Bild sind, gibt es nicht mehrere Optionen, um eine bessere Referenz für jeden Block zu finden ...
... z. B. nachdem sich ein Vordergrundobjekt vor ein Hintergrunddetail bewegt hat, kann der Encoder Bits sparen, indem er darauf verweist, wie es in einem älteren Frame aussah, bevor es verdeckt wurde. h.264 kann Referenzrahmen pro Block auswählen. Dies ist ein relativ kleiner Effekt; Gute h.264-Encoder kommen mit nur 1 Referenzframe aus, aber es ist immer noch etwas schädlich für die Komprimierungseffizienz
Sicher, Sie brauchen immer noch die richtigen Codierungseinstellungen, aber Sie können Ihre GOP-Größe erhöhen, anstatt Ihre Bildrate zu reduzieren, wenn die Dinge so statisch sind. Wenn dies nicht der Fall ist, ist das Verringern der Bildrate zunächst keine gute Option. Ich frage mich, ob an einem variablen GOP-Format gearbeitet wurde.
Ich denke, wiederholte Bilder werden immer noch die Gelegenheit für nützliche B-Pyramiden- und mehrere Referenz-P-Frame-Optionen verringern. Aber ich denke, ein Encoder kann ein altes P-Frame von überall innerhalb der GOP behalten, also ist der Verlust von Referenz-B-Frames wahrscheinlich alles in der Theorie, aber IDK in der Praxis.
Die meisten Formate sind variable GOP, und jeder gute Encoder wird das verwenden! Die Standardeinstellung von x264 besteht darin, GOPs opportunistisch zu beenden, wenn Szenenschnitte erkannt werden, indem ein IDR-Frame eingefügt wird. ( keyint=250ist die maximale GOP-Länge. keyint_min=25ist das minimale Intervall, damit kein weiterer Keyframe eingefügt wird, selbst wenn es glaubt, dass es einen anderen Szenenschnitt sieht; es gibt Tuning-Optionen für Szenenschnitt-Bias usw.) x26 5 hat sogar einen zusätzlichen GOP-Lookahead-Parameter für opportunistische Erweiterung einer GOP. x265.readthedocs.io/en/default/cli.html#cmdoption-gop-lookahead . Und natürlich sind adaptive B-Frame-Entscheidungen standardmäßig aktiviert
Schön, erstaunlich, wie weit sie sich weiterentwickelt haben, seit ich mich das letzte Mal mit dem wirklichen Kern der Encoder befasst habe. Ich behalte einen Überblick auf hohem Niveau, aber mein letzter extrem tiefer Tauchgang war die MPEG-2-Ära ... Es könnte jedoch an der Zeit sein, einen weiteren tiefen Tauchgang auf h265 zu machen.
Gute MPEG-2-Encoder können Keyframe-Entscheidungen basierend auf Szenenschnitten und P-vs-B-Frame-Entscheidungen basierend auf dem Inhalt treffen. Der Encoder von :P ffmpeg mpeg2videolistet eine -sc_thresholdOption und eine -b_strategyOption zur Steuerung der I/P/B-Auswahlstrategie auf. Trotzdem ist h.265 ordentlich, mit bis zu 32 x 32 DCT-Blöcken und sehr großen 64 x 64-Vorhersageeinheiten, die bei Bedarf in kleinere Blöcke zerlegt werden können. sonnati.wordpress.com/2014/06/20/h265-part-i-technical-overview . im Vergleich zu h.264 16x16 Makroblöcken mit nur 4x4 oder 8x8 (nur High Profile) DCT-Blöcken. Auch forum.doom9.org/showthread.php?t=167081

Ich habe damit herumgespielt, eine Reihe von Standbildern in eine h.264-Diashow umzuwandeln, hauptsächlich um die Komprimierungseffizienz von JPG mit h.264 zu vergleichen. Ich habe einige nützliche Antworten zu den technischen Auswirkungen von x264-Entwicklern auf doom9 erhalten. Zwingen Sie z. B. x264, dafür keine B-Frames zu verwenden, da nicht sehr verwandte Bilder viele I-Makroblöcke benötigen und die Codierung in B-Frames teurer ist.

Das Verhalten von Software-Playern bei Videos mit niedrigen fps war in der Vergangenheit nicht ideal. Ich glaube, ein älterer Player hat nur nach Tastatureingaben gesucht, wenn ein Frame angezeigt wurde. Es gab also eine Verzögerung zwischen Benutzereingabe und Spielerantwort. mplayer2 und mpv haben dieses Problem nicht. Außerdem suchen Spieler, die nur nach Keyframes suchen können, in wirklich großen Abschnitten (2 Minuten oder so!), wenn Sie das Keyframe-Intervall nicht reduzieren. x264 fügt IDR (GOP-Grenzen) nicht überall ein, wenn die Bilder irgendwie miteinander verwandt sind.

Verwenden Sie x264 -tune stillimage. Es kurbelt die Psy-Optimierungen an, da die zeitliche Stabilität für diesen Anwendungsfall kein Problem darstellt. Weitere Suchergebnisse: von google .

Ich würde anderen Vorschlägen zustimmen, einige Frames zu duplizieren, um die FPS auf mindestens 5 oder so zu bringen, nur für den Fall schlechter Spieler. Smartphones / Tablets sollten jedoch kein Problem haben, Videos mit variablen FPS abzuspielen, da sie normalerweise auf diese Weise aufnehmen, wenn die Lichtverhältnisse sinken. Da Videos mit variablen FPS von Telefonen jetzt auf dem Markt sind, sollte Hardware-Player-Unterstützung für sie erwartet werden. Ich würde keine Probleme erwarten , aber ich wäre auch nicht überrascht, wenn es zumindest einige alte Hardware-Player gibt, die nicht gut damit umgehen.

Ein Frame aller „Skip“-Makroblöcke benötigt bei 1080p, IIRC, nur etwa 20 Bytes. Ein Grund, warum ich doppelte Frames nicht mag, ist, dass es das manuelle Durchlaufen der Bilder im Einzelschritt stört.


Das Duplizieren von Frames hat jedoch einen Nachteil bei der Komprimierung : Wenn zwischen den verschiedenen Bildern viel Redundanz besteht (dh es ist immer noch ein Video, keine Diashow), erschwert das Auffüllen mit identischen Bildern es dem Encoder, diese zu finden und auszunutzen.

Abhängig von den Codierungseinstellungen behält der Encoder nur eine gewisse Anzahl alter Frames als mögliche Referenzen für neue Frames und kann nur innerhalb einer GOP suchen (z. B. standardmäßig 250 Frames für x264). Wenn alle diese Kandidaten dasselbe Bild sind, gibt es nicht mehrere Optionen, um eine bessere Referenz für jeden Block zu finden.

Beispiel: Nachdem sich ein Vordergrundobjekt vor ein Hintergrunddetail bewegt hat, kann der Encoder Bits sparen, indem er darauf verweist, wie es in einem älteren Frame aussah, bevor es verdeckt wurde. h.264 kann Referenzrahmen pro Block auswählen. Dies ist ein relativ kleiner Effekt; Gute h.264-Encoder kommen mit nur 1 Referenzframe aus, aber es ist immer noch etwas schädlich für die Komprimierungseffizienz und eine Verschwendung von Strom / Batterielebensdauer / CPU-Zeit auf der Dekomprimierungsseite, um Speicher um das Dekodieren und Anzeigen zusätzlicher Frames zu kopieren.


Die Wiederherstellung von VFR nach einem NLE zwingt alle Ihre Clips zu einer hohen Bildrate:

FFmpeg hat einen mpdecimateFilter, der ähnliche Frames verwirft. Sie können festlegen, wie viele Frames hintereinander gelöscht werden können. Mit einem engen Ähnlichkeitsschwellenwert sollten Sie ihn dazu bringen, nur tatsächliche Duplikate zu löschen.

zB ffmpeg -i input.mp4 -vf mpdecimate=max=9:hi=400 -c:a copy -c:v libx264 -preset veryslow -tune film output_vfr.mkvDrops bis zu 9 Frames hintereinander, und nur wenn der unterschiedlichste Block unter "400" verschieden war, und (Standard): nicht mehr als 33% der Blöcke waren um "320" Einheiten verschieden. IIRC, es ist im Grunde ein 8x8 SAD auf Pixelkomponenten.

(FFmpeg verwendet jedoch standardmäßig CFR für .mp4Ausgaben, verwenden Sie es also für die Ausgabe -vsync 2mit variabler Bildrate.mp4 . Ich denke , das ist sicher: Probleme mit der Bildrate bei der Videokonvertierung mit ffmpeg mit libx264 )

Mit den meisten NLEs können Sie ein Standbild in der Form importieren, wie lange es in der Timeline angezeigt werden soll, vorausgesetzt, Sie haben die Projekteigenschaften auf eine Standardbildrate wie 30 fps oder 24 fps usw. eingestellt.

In Vegas Pro kann ich die Zeit einstellen, zu der ein Standbild auf der Timeline erscheinen soll, von Sekundenbruchteilen bis zu mehreren Sekunden. Wenn ich dies auf 1 Sekunde einstelle, generiert Vegas beim Ziehen und Ablegen eines Standbilds in der Timeline genügend Frames, um meine Anforderung zu erfüllen. Normalerweise bearbeite ich Videos mit 30 fps, und wenn ich ein Standbild hinzufüge, mische ich eine Timeline mit einem bereits vorhandenen 30-fps-Video (AVCHD 1080p).

Um Ihnen eine konkrete Antwort zu geben, müsste ich wissen, welches NLE Sie verwenden.

Ich wende einfach eine Raw-Encoding-Software wie ffmpegoder avconvan, also brauche ich nicht über irgendein NLE zu sprechen. Ich denke, die Frage ist ziemlich genau beantwortet mit "Nehmen Sie einfach eine Standardbildrate, mit der alle Spieler richtig umgehen können. Es gibt keine wirkliche "Ressourcenverschwendung", da das Codierungsschema gut genug ist, um effizient mit Standbildern umzugehen."