Variable Bitraten für Streaming?

Ich erstelle Voreinstellungen für unsere Benutzer, um die Videos in ein geeignetes Format für unser Online-Video-Repository zu konvertieren. Da es schon eine Weile her ist, seit ich so etwas von Grund auf neu erstellt habe, habe ich mir angesehen, was andere empfehlen, und festgestellt, dass viele von ihnen ausdrücklich die Codierung mit variabler Bitrate empfehlen. Zum Beispiel:

https://support.google.com/youtube/answer/1722171?hl=de

Würde das selbst bei progressivem oder Pseudo-Streaming nicht nur zu Pausen und Stottern bei der Wiedergabe führen, sobald Sie ein Segment mit einer hohen Bitrate erreichen? Als allgemeine Empfehlung erscheint es nur seltsam, wenn dies wahrscheinlich zu einem schlechten Wiedergabeerlebnis führt. Oder überschätze ich nur die Probleme, da es einige Jahre her ist, seit ich mich das letzte Mal damit befasst habe. Verwenden Sie heutzutage im Allgemeinen eine variable Bitrate für die Online-Bereitstellung?

Ich glaube, Sie missverstehen, was die Codierung mit variabler Bitrate bewirkt. Es führt nicht zu Stottern oder Pausen.
IDK, der dies abgelehnt hat. Es ist keine schlechte Frage, IMO, nur eine komplette Anfängerfrage.
Beachten Sie auch, dass Ihr Link dazu dient, Videos zum HOCHLADEN auf YouTube zu erstellen, damit sie vor dem Streamen transkodiert werden können. Dieser Anwendungsfall, einmal codieren, einmal decodieren, ohne Echtzeitbeschränkung, ist völlig anders als das Hosten von Videos, die von Leuten gestreamt werden können. Für das Hochladen auf YouTube möchten Sie viel Bitrate verwenden, und wenn Sie über die Upload-Bandbreite verfügen, ist die Codierungszeit von ähnlichem Wert wie die resultierende Dateigröße. Sie könnten also verwenden x264 --crf 16 --preset fast.
Ich verstehe mich nicht falsch und bin auch kein Anfänger (meinen ersten Streaming-Videodienst habe ich tatsächlich 1997 erstellt). Ich werde auf den Rest in Ihrer Antwort dort antworten, aber zur Klarstellung – der Link war nur ein Beispiel für eine Empfehlung, die ich überall sehe. Basierend auf Ihren Antworten scheint es, dass jeder einfach davon ausgeht, dass die Pipes und Puffer groß genug sind, um heutzutage Spitzen in den Bitraten auszugleichen.

Antworten (1)

Spieler puffern Streams. Je größer die Puffergröße, desto länger muss der Encoder höhere Bitraten für harte Inhalte und dann weniger Bits früher oder später für einfache Inhalte verwenden, um eine ähnliche Qualität für das gesamte Video zu erreichen.

Ich gehe davon aus, dass Sie h.264 (alias AVC) als Codec verwenden werden, da dies der De-facto-Standard für das Streamen von Videos im Internet ist. VP8 ist nicht so gut. VP9 kann besser aussehen als h.264, aber die Unterstützung ist begrenzt. HEVC (h.265) ist ebenfalls besser als h.264, aber auch hier ist die Spielerunterstützung begrenzt. (Und die Hardwaredekodierungsbeschleunigung wird jahrelang nicht weit verbreitet sein. Dies ist wichtig, da HEVC sehr CPU-intensiv zu dekodieren ist, mehr als AVC.)

Die Qualitätsvergleiche, von denen ich spreche, sind mit den besten verfügbaren Encodern für jeden Codec. x264 für AVC, Googles VPx für VP8/VP9 und x265 für HEVC. Alle mit fast vollständig aufgedrehten Einstellungen. x265 beginnt jedoch bei 1080p mit so langsamen Einstellungen in Sekunden pro Frame statt in Frames pro Sekunde zu gelangen. (X264-Größenordnungen schneller, da es seit ein paar Jahren im Wesentlichen ausgereift ist und nur wenige neue Beschleunigungen oder Qualitätsgewinne gefunden wurden.)

Alle diese Encoder sind kostenlose Open-Source-Software. Es ist schön, dass Sie heutzutage nichts bezahlen müssen, um Codecs in Weltklasse-Qualität zu erhalten. :)

Ein zufälliger Google-Treffer auf x264 vbv zum Streamen: http://forum.doom9.org/showthread.php?t=147460

Ein Beispiel aus x264 --fullhelp:

  Constant bitrate at 1000kbps with a 2 second-buffer:
        x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>

(Verwenden Sie jedoch nicht den One-Pass-Zielbitratenmodus. Entweder 2pass, wenn Sie eine bestimmte Zielbitrate haben, oder crf mit einer Zielqualität.)

Bearbeiten: Die empfohlene Verwendung für das Streaming ist laut dem führenden x264-Entwickler (Jason Garrett-Glaser) der Qualitätszielmodus (CRF) mit VBV-beschränkter Bitrate. z.B

x264 --vbv-bufsize 2000 --vbv-maxrate 1000 --crf 22 -preset slower -o <output> <input>

vbv-maxrateist die maximale Geschwindigkeit, mit der sich der Puffer füllen kann. (dh die maximale Netzwerkbandbreite). vbv-bufsizeist natürlich die Größe des Puffers, der nicht anhaltende Bitratenspitzen von mehr als vbv-maxrate.

Und natürlich, wenn Sie einmal kodieren, um eine Datei zu erstellen, die viele Male gestreamt wird, werfen Sie so viel CPU-Zeit darauf, wie Sie können. Die Kodierungszeit ist im Vergleich zur Erzielung der höchsten Qualität pro Bitrate (Rate-Distortion Tradeoff, auch bekannt als RD) von geringer Bedeutung. Die Codierung erfolgt nur einmal, und alle Bits, die Sie sparen können (bei gleichbleibender Qualität), werden für jeden Download gespeichert. zB Verwenden Sie x264 mit --preset veryslow.

Wie Sie sagen, puffern Spieler Streams. Was passiert also, wenn der Puffer erschöpft ist? Warum die Wiedergabe ruckelt und natürlich pausiert! Nehmen Sie Ihr oben zitiertes Beispiel. Stellen Sie sich vor, dass ein Benutzer eine solide 1200-kbit/s-Verbindung zu meinem Dienst erhält. Stellen Sie sich vor, der Benutzer sieht sich einen Stream an, der in den ersten fünf Minuten etwa 1000 kbit/s benötigt. Großartig! Aber wenn diese Datei jetzt VBR ist (beachten Sie, dass ihr Beispiel es nicht ist), benötigt Ihre Datei möglicherweise plötzlich 2500 kbit / s für die nächsten fünf Minuten. Dein 2-Sekunden-Puffer läuft ziemlich schnell ab und der Betrachter kann das Video im Grunde nicht mehr ansehen.
Der springende Punkt, dem Encoder die Puffergröße mitzuteilen, besteht darin, dass er dies für die Ratensteuerung berücksichtigen kann, um sicherzustellen, dass der Puffer nicht unterläuft. x264 wird Sie immer warnen, wenn es Ihre VBV-Anforderungen nicht erfüllen konnte. (z. B. extrem niedrige Bitrate für HD, und es konnte nicht einmal dorthin gelangen, indem alles zu Mist verwischt wurde.)
Ich denke, was die Dinge, die Sie bisher gefunden haben, nicht erklärt haben, ist, dass VBR nicht reine Qualitätsziel-VBR bedeuten muss. Moderne Audio- und Video-Encoder unterstützen jetzt Constrained-VBR-Ratensteuerung, bei der auch allgemeine und lokale Bitraten-Limits eingehalten werden. Aber ansonsten steht es ihnen frei, Bits dort auszugeben, wo sie benötigt werden, um so viel Qualität wie möglich für den gesamten Clip zu erhalten. Sie haben Recht, dass es hier ein Problem gibt, das berücksichtigt werden muss, und --vbv-buffsizewie es gemacht wird.
Bearbeiten: Meine Antwort aktualisiert, nachdem ich erneut gegoogelt habe. vbv-maxrateist die Pufferfüllrate, nicht die Decoder-CPU-begrenzte Decodierspitze. Und CRF + VBV ist der empfohlene Weg für die Online- (Echtzeit) oder Offline-Codierung von Videos für das Streaming.