Twitch hat einen Beitrag dazu. Sie erklären, dass sie aus mehreren Gründen beschlossen haben, ihr eigenes Programm zu verwenden. Eine davon war, dass Sie mit ffmpeg nicht verschiedene x264-Instanzen in verschiedenen Threads ausführen können, sondern alle angegebenen Threads einem Frame in einer Ausgabe zuweisen, bevor Sie zur nächsten Ausgabe übergehen.
Wenn Sie kein Echtzeit-Streaming durchführen, haben Sie mehr Luxus. Der 'richtige' Weg ist wahrscheinlich, bei einer Auflösung nur die mit -g angegebene GOP-Größe zu codieren und dann die anderen Auflösungen zu codieren, die Keyframes an denselben Stellen erzwingen.
Wenn Sie das tun möchten, können Sie ffprobe verwenden, um die Keyframe-Zeiten abzurufen, und dann ein Shell-Skript oder eine tatsächliche Programmiersprache verwenden, um das in einen ffmpeg-Befehl zu konvertieren.
Bei den meisten Inhalten besteht jedoch kaum ein Unterschied zwischen einem Keyframe alle 5 Sekunden und zwei Keyframes alle 5 Sekunden (eines erzwungen und eines aus Scenecut). Dies ist ungefähr die durchschnittliche Größe von I-Frames im Vergleich zur Größe von P-Frames und B-Frames. Wenn Sie x264 mit typischen Einstellungen verwenden (der einzige Grund, weshalb Sie meines Erachtens irgendetwas tun sollten, um dies zu ändern, ist die Einstellung von -qmin, um zu verhindern, dass x264 bei einfachen Inhalten die Bitrate verwendet), wodurch alle Rahmentypen auf den gleichen Wert begrenzt werden , Denke ich) und erhalte ein Ergebnis wie I-Frame-Durchschnittsgröße von 46 kB, P-Frame 24 kB, B-Frame 17 kB (halb so häufig wie P-Frames), dann ein zusätzliches I-Frame pro Sekunde bei 30 fps ist nur eine 3% ige Zunahme der Dateigröße. Der Unterschied zwischen h264 und h263 könnte aus einer Menge von 3% Abnahmen bestehen, aber eine einzige ist nicht sehr wichtig.
Bei anderen Inhaltstypen unterscheiden sich die Bildgrößen. Fairerweise geht es hier um zeitliche und nicht um räumliche Komplexität. Es geht also nicht nur um einfachen Inhalt, sondern auch um harten Inhalt. Im Allgemeinen ist die Bitrate für Streaming-Video-Websites jedoch begrenzt, und Inhalte mit relativ großen I-Frames sind einfache Inhalte, die unabhängig von der Anzahl der hinzugefügten zusätzlichen Keyframes in hoher Qualität codiert werden. Es ist verschwenderisch, aber diese Verschwendung wird normalerweise nicht bemerkt. Der verschwenderischste Fall ist wahrscheinlich ein Video, das nur ein statisches Bild eines Songs ist, bei dem jeder Keyframe genau gleich ist.
Ich bin mir nicht sicher, wie erzwungene Keyframes mit dem mit -maxrate und -bufsize festgelegten Ratenbegrenzer interagieren. Ich denke, sogar YouTube hatte kürzlich Probleme, die Puffereinstellungen richtig zu konfigurieren, um eine gleichbleibende Qualität zu erzielen. Wenn Sie nur durchschnittliche Bitrateneinstellungen verwenden, wie dies von einigen Sites angezeigt wird (da Sie die x264-Optionen im Header / Mov-Atom mit einem Hex-Editor überprüfen können), ist das Puffermodell kein Problem Durch die durchschnittliche Bitrate wird der Nutzer dazu aufgefordert, am Ende seines Videos einen schwarzen Bildschirm einzufügen.
Die Option -g von Ffmpeg oder eine andere von Ihnen verwendete Encoder-Option wird der encoderspezifischen Option zugeordnet. Also ist '-x264-params keyint = GOPSIZE' gleichbedeutend mit '-g GOPSIZE'.
Ein Problem bei der Szenenerkennung besteht darin, dass Sie aus irgendeinem Grund Keyframes in der Nähe bestimmter Zahlen bevorzugen. Wenn Sie alle 5 Sekunden Keyframes angeben und die Szenenerkennung verwenden und bei 4.5 eine Szenenänderung auftritt, sollte diese erkannt werden, der nächste Keyframe jedoch bei 9.5. Wenn die Zeit so schnell wird, könnten Sie Keyframes bei 42,5, 47,5, 52,5 usw. anstelle von 40, 45, 50, 55 erhalten. Wenn sich die Szene bei 5,5 ändert, ist dies umgekehrt der Fall Ein Keyframe mit 5 und 5.5 ist für einen anderen zu früh. In Ffmpeg können Sie nicht angeben, dass hier ein Keyframe erstellt werden soll, wenn innerhalb der nächsten 30 Frames keine Szenenänderung erfolgt. Jemand, der C versteht, könnte diese Option jedoch hinzufügen.
Wenn Sie bei Videos mit variabler Bildrate nicht wie Twitch Live-Streaming betreiben, sollten Sie in der Lage sein, Szenenänderungen zu verwenden, ohne diese dauerhaft in eine konstante Bildrate zu konvertieren. Wenn Sie den Filter 'select' in ffmpeg verwenden und die Konstante 'scene' im Ausdruck verwenden, wird in der Debug-Ausgabe (-v debug oder drücken Sie mehrmals '+' während der Codierung) die Szenenänderungsnummer angezeigt. Dies unterscheidet sich wahrscheinlich von der von x264 verwendeten Nummer und ist nicht so nützlich, könnte aber dennoch nützlich sein.
Das Verfahren würde dann wahrscheinlich darin bestehen, ein Testvideo zu erstellen, das nur für Keyframe-Änderungen gedacht ist, bei Verwendung von 2-Pass jedoch möglicherweise für Daten zur Ratensteuerung verwendet werden kann. (Sie sind sich nicht sicher, ob die generierten Daten für unterschiedliche Auflösungen und Einstellungen überhaupt nützlich sind; die Makroblock-Baumdaten sind es nicht.) Konvertieren Sie sie in ein Video mit konstanter Framerate, aber sehen Sie diesen Fehler, wenn Sie die Framerate halbieren, falls Sie sich jemals entscheiden um den fps filter für andere zwecke zu verwenden. Führen Sie es über x264 mit den gewünschten Keyframe- und GOP-Einstellungen aus.
Verwenden Sie dann einfach diese Keyframe-Zeiten mit dem Originalvideo mit variabler Bildrate.
Wenn Sie völlig verrückte benutzergenerierte Inhalte mit einer Lücke von 20 Sekunden zwischen Frames zulassen, können Sie für die Codierung mit variabler Framerate die Ausgabe aufteilen, den fps-Filter verwenden und irgendwie einen Auswahlfilter verwenden (möglicherweise einen wirklich langen Ausdruck erstellen, der hat) every keyframe time) ... oder Sie könnten das Testvideo als Eingabe verwenden und entweder nur Keyframes decodieren, wenn diese ffmpeg-Option funktioniert, oder den Auswahlfilter verwenden, um Keyframes auszuwählen. Skalieren Sie es dann auf die richtige Größe (es gibt sogar einen scale2ref-Filter dafür) und überlagern Sie es mit dem Originalvideo. Verwenden Sie dann den Interleave-Filter, um diese zu erzwingenden Keyframes mit dem Originalvideo zu kombinieren. Wenn dies zu zwei Frames mit einem Abstand von 0,001 Sekunden führt, den der Interleave-Filter nicht verhindert, können Sie dieses Problem mit einem anderen Auswahlfilter selbst beheben. Das Hauptproblem könnte hier der Umgang mit Frame Buffer Limits für das Interleave-Filter sein. Diese könnten alle funktionieren: Verwenden Sie eine Art Filter, um den dichteren Strom zu puffern (FIFO-Filter?); Verweisen Sie mehrmals auf die Eingabedatei, damit sie mehrmals dekodiert wird und keine Frames gespeichert werden müssen. Verwende den 'Streamselect'-Filter, den ich noch nie gemacht habe, genau zu den Zeiten der Keyframes. Verbessern Sie den Interleave-Filter, indem Sie sein Standardverhalten ändern oder eine Option hinzufügen, um den ältesten Frame in einem Puffer auszugeben, anstatt einen Frame zu löschen. was ich noch nie gemacht habe, genau zu den Zeiten der Keyframes; Verbessern Sie den Interleave-Filter, indem Sie sein Standardverhalten ändern oder eine Option hinzufügen, um den ältesten Frame in einem Puffer auszugeben, anstatt einen Frame zu löschen. was ich noch nie gemacht habe, genau zu den Zeiten der Keyframes; Verbessern Sie den Interleave-Filter, indem Sie sein Standardverhalten ändern oder eine Option hinzufügen, um den ältesten Frame in einem Puffer auszugeben, anstatt einen Frame zu löschen.