Wie wir die Videokodierung achtmal beschleunigt haben



Jeden Tag sehen Millionen von Zuschauern Videos im Internet. Damit das Video verfügbar wird, muss es nicht nur auf den Server hochgeladen, sondern auch verarbeitet werden. Je schneller dies geschieht, desto besser sind der Dienst und seine Benutzer.

Mein Name ist Askar Kamalov, vor einem Jahr bin ich dem Yandex-Videotechnik-Team beigetreten. Heute werde ich den Lesern von Habr kurz erzählen, wie wir es mit Hilfe der Parallelisierung des Codierungsprozesses geschafft haben, die Bereitstellung von Videos für den Benutzer um ein Vielfaches zu beschleunigen.

Dieser Beitrag ist in erster Linie für diejenigen von Interesse, die bisher nicht darüber nachgedacht haben, was unter der Haube von Videodiensten geschieht. In den Kommentaren können Sie Fragen stellen und Themen für zukünftige Beiträge vorschlagen.

Ein paar Worte zur Aufgabe. Yandex hilft nicht nur bei der Suche nach Videos auf anderen Websites, sondern speichert auch Videos für seine eigenen Dienste. Ob es sich um ein Autorenprogramm oder ein Sportmatch in Ether, einen Film auf KinoPoisk oder Videos in Zen and News handelt - all dies wird auf unsere Server hochgeladen. Damit Benutzer ein Video ansehen können, muss es vorbereitet sein: Konvertieren Sie es in das erforderliche Format, erstellen Sie eine Vorschau oder fahren Sie es sogar über die DeepHD- Technologie . Eine unvorbereitete Datei nimmt nur Speicherplatz ein. Und wir sprechen nicht nur über die optimale Verwendung von Eisen, sondern auch über die Geschwindigkeit der Bereitstellung von Inhalten für Benutzer. Beispiel: Ein Datensatz mit dem entscheidenden Moment eines Hockeyspiels kann innerhalb einer Minute nach dem Ereignis selbst in der Suche durchsucht werden.

Sequentielle Codierung


Das Glück des Benutzers hängt also weitgehend davon ab, wie schnell das Video verfügbar wird. Und dies wird hauptsächlich durch die Geschwindigkeit der Transcodierung bestimmt. Wenn es keine strengen Anforderungen für die Geschwindigkeit des Video-Uploads gibt, gibt es keine Probleme. Nehmen Sie eine einzelne, unteilbare Datei, konvertieren Sie sie und laden Sie sie hoch. Zu Beginn unserer Reise haben wir folgendermaßen gearbeitet:



Der Client lädt das Video in das Repository hoch, die Analyzer-Komponente sammelt Metainformationen und überträgt das Video zur Konvertierung in die Worker-Komponente. Alle Schritte werden nacheinander ausgeführt. Gleichzeitig können viele Server zum Codieren vorhanden sein, aber nur einer ist mit der Verarbeitung eines bestimmten Videos beschäftigt. Einfaches, transparentes Layout. Hier enden seine Vorzüge. Ein solches Schema ist nur vertikal skaliert (aufgrund des Kaufs leistungsfähigerer Server).

Sequentielle Codierung mit Zwischenergebnis


Um die schmerzhaften Erwartungen irgendwie auszugleichen, hat die Branche eine schnelle Codierungsoption entwickelt. Dies ist ein trügerischer Name, da die vollständige Codierung tatsächlich nacheinander und so lange erfolgt. Aber mit einem Zwischenergebnis. Die Idee ist, die niedrig aufgelöste Version des Videos so schnell wie möglich vorzubereiten und hochzuladen, und erst dann die höher auflösenden Versionen.

Einerseits wird Video schneller. Und es ist nützlich für wichtige Ereignisse. Andererseits ist das Bild verschwommen, und das nervt das Publikum.

Es stellt sich heraus, dass Sie das Video nicht nur schnell verarbeiten, sondern auch seine Qualität erhalten müssen. Dies erwarten Benutzer jetzt von einem Videodienst. Es scheint, dass es ausreicht, die produktivsten Server zu kaufen (und sie alle regelmäßig auf einmal zu aktualisieren). Dies ist jedoch ein Weg in eine Sackgasse, da es immer ein Video gibt, das selbst die leistungsstärkste Hardware verlangsamt.

Parallele Codierung


Es ist viel effizienter, eine schwierige Aufgabe in viele weniger komplexe zu unterteilen und sie gleichzeitig auf verschiedenen Servern zu lösen. Dies ist MapReduce für Video. In diesem Fall ruhen wir uns nicht auf der Leistung eines einzelnen Servers aus und können horizontal skalieren (durch Hinzufügen neuer Computer).

Die Idee, ein Video in kleine Teile aufzuteilen, gleichzeitig zu verarbeiten und zusammenzukleben, ist übrigens kein Geheimnis. Sie können viele Verweise auf diesen Ansatz finden (zum Beispiel empfehle ich auf Habré einen Beitrag über das DistVIDc- Projekt ). Dies macht es jedoch im Allgemeinen nicht einfacher, da Sie nicht einfach eine vorgefertigte Lösung in sich selbst einbauen können. Wir müssen uns an unsere Infrastruktur, unser Video und sogar unsere Arbeitsbelastung anpassen. Im Allgemeinen ist es einfacher, eigene zu schreiben.

In der neuen Architektur haben wir den monolithischen Worker-Block mit sequentieller Codierung in Microservices Segmenter, Tcoder, Combiner unterteilt.



  1. Segmenter teilt das Video in ca. 10 Sekunden in Fragmente auf. Fragmente bestehen aus einer oder mehreren GOP ( Gruppe von Bildern ). Jede GOP ist unabhängig und wird separat codiert, sodass sie ohne Bezugnahme auf Frames von anderen GOPs decodiert werden kann. Das heißt, Fragmente können unabhängig voneinander reproduziert werden. Diese Segmentierung reduziert die Latenz und ermöglicht es Ihnen, früher mit der Verarbeitung zu beginnen.
  2. Tcoder . , , (, , ), . , Tcoder .
  3. ombiner : , Tcoder, .

Ein paar Worte zum Sound. Der beliebteste AAC-Audio-Codec hat eine unangenehme Funktion. Wenn Sie die Fragmente separat codieren, funktioniert das nahtlose Zusammenkleben einfach nicht. Übergänge werden spürbar sein. Video-Codecs haben kein solches Problem. Theoretisch kann man nach einer schwierigen technischen Lösung suchen, aber dieses Spiel ist die Kerze einfach nicht wert (Audio wiegt deutlich weniger als Video). Daher wird nur Video parallel zu uns codiert und die Audiospur als Ganzes verarbeitet.

Ergebnisse


Dank der parallelen Videoverarbeitung konnten wir die Verzögerung zwischen dem Herunterladen eines Videos und der Verfügbarkeit für Benutzer erheblich reduzieren. Früher konnte es beispielsweise zwei Stunden dauern, bis mehrere vollwertige Versionen unterschiedlicher Qualität für einen anderthalbstündigen FullHD-Film erstellt wurden. Jetzt dauert alles 15 Minuten. Darüber hinaus erstellen wir bei der Parallelverarbeitung eine hochauflösende Version noch schneller als eine niedrigauflösende Version mit dem alten Ansatz mit einem Zwischenergebnis.

Und etwas anderes. Beim alten Ansatz fehlen möglicherweise Server oder sie waren ohne Aufgaben im Leerlauf. Parallele Codierung kann den Anteil der Eisenverwertung erhöhen. Jetzt ist unser Cluster von mehr als tausend Servern immer mit etwas beschäftigt.

Tatsächlich gibt es noch Raum für Verbesserungen. Zum Beispiel können wir viel Zeit sparen, wenn wir Fragmente eines Videos verarbeiten, noch bevor es vollständig angekommen ist. Wie sie sagen, weiter - mehr.

Schreiben Sie in die Kommentare, welche Aufgaben im Bereich der Arbeit mit Videos Sie lesen möchten.

Nützliche Links zu Branchenkollegen



All Articles