Wie wir die Videoenkodierung verachtfachten

Wie wir die Videoenkodierung verachtfachten

Jeden Tag schauen Millionen von Zuschauern Videos im Internet. Damit ein Video jedoch verfĂŒgbar wird, muss es nicht nur auf den Server hochgeladen, sondern auch bearbeitet werden. Je schneller dies geschieht, desto besser ist der Service fĂŒr die Nutzer.

Ich heiße Askar Kamalov und bin vor einem Jahr zum Team der Videotechnologien von Yandex gestoßen. Heute möchte ich den Lesern von Habr kurz erzĂ€hlen, wie wir durch Parallelisierung des Kodierungsprozesses die Auslieferung von Videos an die Nutzer erheblich beschleunigen konnten.

Dieser Beitrag richtet sich in erster Linie an diejenigen, die sich bisher nicht mit den VorgĂ€ngen hinter Videodiensten beschĂ€ftigt haben. In den Kommentaren können Fragen gestellt und Themen fĂŒr zukĂŒnftige BeitrĂ€ge vorgeschlagen werden.

Einige Worte zur Aufgabe selbst. Yandex hilft nicht nur dabei, Videos auf anderen Seiten zu suchen, sondern speichert auch Videos fĂŒr die eigenen Dienste. Sei es eine Autorenproduktion, ein Sportereignis im Stream, ein Film auf KinoPoisk oder Clips in Zen und Nachrichten – all das wird auf unseren Servern hochgeladen. Damit die Nutzer die Videos ansehen können, mĂŒssen sie vorbereitet werden: in das erforderliche Format konvertiert, ein Vorschaubild erstellt oder sogar durch Technologien verarbeitet werden. DeepHD. Eine unprepared Datei nimmt einfach Speicherplatz ein. Dabei geht es nicht nur um die optimale Nutzung der Hardware, sondern auch um die Geschwindigkeit der DatenĂŒbertragung zu den Nutzern. Beispiel: Ein Video mit dem entscheidenden Moment eines Eishockeyspiels kann bereits eine Minute nach dem Ereignis in der Suche gefunden werden.

Sequenzielle Kodierung

Das Nutzererlebnis hĂ€ngt stark davon ab, wie schnell das Video verfĂŒgbar wird. Dies wird hauptsĂ€chlich durch die Transkodierungsgeschwindigkeit bestimmt. Wenn keine strengen Anforderungen an die Geschwindigkeit der Videoveröffentlichung bestehen, gibt es auch keine Probleme. Man nimmt eine einheitliche, unteilbare Datei, konvertiert sie und veröffentlicht sie. Zu Beginn unserer Reise haben wir genau so gearbeitet:

Wie wir die Videoenkodierung verachtfachten

Der Kunde lĂ€dt ein Video in den Speicher hoch, das Analysemodul sammelt die Metainformationen und ĂŒbertrĂ€gt das Video zur Umwandlung an das Modul Worker. Alle Schritte erfolgen nacheinander. Dabei kann es mehrere Server zum Kodieren geben, jedoch ist immer nur einer mit der Verarbeitung des spezifischen Videos beschĂ€ftigt. Ein einfaches, transparentes Schema. Damit enden jedoch auch die Vorteile. Dieses Modell lĂ€sst sich nur vertikal skalieren (durch den Erwerb leistungsfĂ€higerer Server).

Nacheinander kodieren mit einem Zwischenprodukt

Um die quĂ€lende Wartezeit irgendwie zu lindern, wurde in der Branche eine Option fĂŒr schnelles Kodieren erfunden. TĂ€uschend einfacher Name, denn die vollstĂ€ndige Kodierung erfolgt tatsĂ€chlich nacheinander und dauert genauso lange. Aber dafĂŒr mit einem Zwischenprodukt. Die Idee ist, so schnell wie möglich eine Version des Videos in niedriger Auflösung bereitzustellen und danach die Versionen in höheren Auflösungen.

Einerseits wird das Video schneller verfĂŒgbar. Das ist nĂŒtzlich fĂŒr wichtige Ereignisse. Andererseits ist das Bild verschwommen, was die Zuschauer stört.

Es ist notwendig, nicht nur Videos schnell zu verarbeiten, sondern auch deren QualitĂ€t zu erhalten. Das ist das, was Nutzer von einem Videoservice heutzutage erwarten. Es mag scheinen, dass es ausreicht, die leistungsfĂ€higsten Server zu kaufen (und diese regelmĂ€ĂŸig aufzurĂŒsten). Doch das ist ein aussichtsloser Weg, denn es wird immer Videos geben, die selbst die leistungsstĂ€rkste Hardware ins Stocken bringen.

Parallele Codierung

Es ist erheblich effektiver, eine komplexe Aufgabe in viele weniger komplexe aufzuteilen und diese parallel auf verschiedenen Servern zu lösen. So funktioniert MapReduce fĂŒr Videos. In diesem Fall stoßen wir nicht an die Leistungsgrenzen eines einzelnen Servers und können horizontal skalieren (durch HinzufĂŒgen neuer Maschinen).

Übrigens ist die Idee, Videos in kleine StĂŒcke zu zerlegen, sie parallel zu bearbeiten und dann wieder zusammenzufĂŒgen, kein Geheimnis. Sie finden zahlreiche ErwĂ€hnungen dieses Ansatzes (zum Beispiel empfehle ich den Beitrag ĂŒber das Projekt DistVIDc). Aber das macht es insgesamt nicht einfacher, denn man kann nicht einfach eine fertige Lösung nehmen und in die eigene Infrastruktur integrieren. Eine Anpassung an unsere Infrastruktur, unser Video und sogar unsere Last ist erforderlich. Am besten ist es, selbst eine Lösung zu entwickeln.

In der neuen Architektur des monolithischen Blocks Worker mit sequentieller Kodierung haben wir ihn in die Mikrodienste Segmenter, Tcoder und Combiner aufgeteilt.

Wie wir die Videoenkodierung verachtfachten

  1. Der Segmenter unterteilt das Video in etwa 10-sekĂŒndige Fragmente. Jedes Fragment besteht aus einer oder mehreren GOP (group of pictures). Jede GOP ist unabhĂ€ngig und wird separat kodiert, sodass sie ohne Bezug auf Frames aus anderen GOP dekodiert werden kann. Das bedeutet, dass die Fragmente unabhĂ€ngig voneinander wiedergegeben werden können. Diese Segmentierung verringert die Verzögerung, da die Verarbeitung frĂŒher beginnen kann.
  2. Tcoder verarbeitet jedes Fragment. Er entnimmt die Aufgabe aus der Warteschlange, lÀdt das Fragment aus dem Speicher herunter, kodiert es in verschiedene Auflösungen (denken Sie daran, dass der Player die Version je nach Verbindungsgeschwindigkeit auswÀhlen kann) und legt das Ergebnis wieder im Speicher ab, wÀhrend er das Fragment in der Datenbank als verarbeitet kennzeichnet. Nachdem er alle Fragmente bearbeitet hat, sendet Tcoder die Aufgabe zur Ergebnisbildung an die nÀchste Komponente.
  3. Der Combiner fasst die Ergebnisse zusammen: Er lĂ€dt alle Fragmente, die von Tcoder erstellt wurden, herunter und bildet Streams fĂŒr verschiedene Auflösungen.

Ein paar Worte zum Sound. Der beliebteste Audiocodec AAC hat eine unangenehme Eigenheit. Wenn Fragmente separat codiert werden, lassen sie sich einfach nicht nahtlos zusammenfĂŒgen. ÜbergĂ€nge werden deutlich hörbar sein. Bei Videocodecs besteht dieses Problem nicht. Theoretisch könnte man nach einer komplexen technischen Lösung suchen, aber dieses Spiel lohnt sich derzeit einfach nicht (Audio ist deutlich leichter als Video). Daher wird bei uns parallel nur das Video codiert, wĂ€hrend die Audiospur vollstĂ€ndig verarbeitet wird.

Ergebnisse

Dank der parallelen Bearbeitung von Videos haben wir die Verzögerung zwischen dem Hochladen des Videos und dessen VerfĂŒgbarkeit fĂŒr die Nutzer erheblich verringert. Zum Beispiel konnte die Erstellung mehrerer vollstĂ€ndiger Versionen in unterschiedlicher QualitĂ€t fĂŒr einen 1,5-stĂŒndigen FullHD-Film frĂŒher bis zu zwei Stunden dauern. Jetzt benötigt dies nur noch 15 Minuten. DarĂŒber hinaus erstellen wir bei der parallelen Bearbeitung die Version in hoher Auflösung sogar schneller als die Version in niedriger Auflösung nach dem alten Ansatz mit einem Zwischenergebnis.

Und noch etwas. Bei der alten Methode gab es entweder nicht genug Server oder sie waren untĂ€tig. Paralleles Kodieren ermöglicht eine höhere Auslastung der Hardware. Jetzt ist unser Cluster mit ĂŒber tausend Servern stĂ€ndig beschĂ€ftigt.

TatsĂ€chlich gibt es noch viel Entwicklungspotenzial. Zum Beispiel könnten wir erheblich Zeit sparen, wenn wir beginnen, Videofragmente zu verarbeiten, noch bevor sie vollstĂ€ndig an uns ĂŒbertragen werden. Wie man so schön sagt, nach dem ersten Schritt folgt der nĂ€chste.

Bitte teilen Sie in den Kommentaren mit, ĂŒber welche Videoverarbeitungsaufgaben Sie gerne lesen wĂŒrden.

NĂŒtzliche Links zu den Erfahrungen von Kollegen in der Branche

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster