Video über mehrere Server streamen

497
sanjihan

Ich habe ein besonderes Problem.

Server 1A ist ein Server, mit dem die Benutzer interagieren. Die Server 2B, 2C und 2D speichern Videoinhalte.

Auf einer Website wird ein HTML-Video-Tag platziert

<video src="server1adomain.com/videos?video=Gy12C899"> 

Video über mehrere Server streamen

Immer wenn dieser Inhalt abgerufen wird, bestimmt ein Backend-Skript auf dem Server 1A, auf welchem ​​Server (2B, 2C oder 2D) das Video gespeichert ist, und ruft es ab. Nehmen wir an, es ist auf 2B. Ich möchte nicht darauf warten, dass das gesamte Video von 2B abgerufen und auf einem 1A-Server gespeichert wird und erst nach Ablauf dieser Zeit an den Benutzer gesendet wird. Stattdessen möchte ich, dass ein kontinuierlicher Strom von 2B zu 1A und gleichzeitig zum Benutzer fließt. Auf diese Weise erhält der Benutzer die ersten Frames des Videos mit minimaler Verzögerung.

Was ist die Standardlösung für dieses Problem? Ich habe mir src von Videos auf youtube angesehen, und sie scheinen alle von derselben Domain abgerufen zu werden, daher muss dieser Ansatz möglich sein.

0

1 Antwort auf die Frage

2
slhck

Es gibt mehrere Lösungen, die mehr oder weniger Industriestandard sind. Ich würde davon abraten, andere hackige Lösungen für Ihr Problem zu finden.

Erstens verwenden große Streaming-Sites Content Delivery Networks (CDNs), auf denen der eigentliche Inhalt gehostet wird. Diese Server unterscheiden sich von den Webservern (die die Webseite oder Skripts hosten) und arbeiten unabhängig voneinander. Sie dienen hauptsächlich dazu, Videoinhalte zu hosten und näher am Standort des Benutzers zu speichern. Die Aufgabe Ihrer Webanwendung besteht darin, die Videoquellenverknüpfung, die auf Server A verweist, durch eine direkte Verbindung zum Inhaltsserver zu ersetzen - je nachdem, welcher näher am Benutzer liegt oder schneller reagiert (ein typischer Lastausgleichsfall). Bei Servern der zweiten Schicht sollten Sie einen Webserver (wie Nginx) einrichten und direkt mit den Videos verknüpfen.

Wenn Sie die Netzwerkanfragen Ihres Browsers an YouTube überprüfen, verwenden diese unterschiedliche Domains. Der Videoinhalt stammt aus einer völlig anderen Quelle als die eigentliche Website - höchstwahrscheinlich ist dies ein Server in Ihrer Nähe, mit dem Ihr ISP eine direkte Peering-Verbindung hat.

Stellen Sie sicher, dass Ihre Videos, wenn es sich um MP4-Dateien handelt, ihr MOOV-Atom am Anfang der Datei haben. Dies verringert die Startverzögerung, da der Client möglicherweise abgespielt wird, auch wenn die gesamte Datei noch nicht übertragen wurde. Mit ffmpeg können Sie dies tun, indem Sie die -movflags +faststartOption während der Codierung hinzufügen (um ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4nur eine vorhandene Datei zu reparieren). Oder verwenden Sie das qt-faststartProgramm (oder eine Implementierung davon) für eine vorhandene Datei.

Die beste Option wäre, den CDN-Ansatz mit dem adaptiven HTTP-Streaming (DASH oder HLS) zu koppeln. Anstelle einer einfachen HTML5-Videoquelle, die höchstwahrscheinlich eine große Datei ist, würden Sie einzelne Videostücke streamen. Dies führt zu schnelleren Startzeiten und einem besseren Umgang mit unterschiedlichen Client-Bandbreiten. Es ist jedoch viel komplizierter, von Grund auf neu einzurichten. Es gibt natürlich Anbieter, die Streaming-Lösungen vom Typ DASH anbieten, bei denen Sie lediglich das Quellvideo zur Verfügung stellen müssen, und Sie können ihren Player auf Ihrer Website implementieren. Sie kümmern sich um die Kodierung und CDN-Sachen. Einige Beispiele sind Bitmovin, Encoding.com oder Wowza.

Danke für eine gründliche Antwort. CDN scheint in den meisten Fällen der richtige Weg zu sein. Der Grund, warum ich über einen intermittierenden Server streamen möchte, ist das Ausblenden der Speicherorte der Speicherserver. Ich habe eine F & A gefunden, die eine Lösung vorschlägt, https://stackoverflow.com/questions/38417350/php-curl-realtime-proxy-stream-file#answer-38418060, aber ich konnte nur Videodateien direkt herunterladen. Als ich versuchte, das `src`-Attribut im HTML-Video-Tag für das PHP-Skript festzulegen, erhielt ich einen 400-Fehler. Kennen Sie eine Lösung für dieses Problem? sanjihan vor 6 Jahren 0
Ahh, der 400er Fehler war mein schlechter. Es funktioniert jetzt, aber id wartet, bis die Datei heruntergeladen ist. Ich werde nachsehen, ob dies mit dem Moov-Atom zu tun hat sanjihan vor 6 Jahren 0
Ja, der Code in Q & A scheint auf meinen lokalen Computern gut zu funktionieren. sanjihan vor 6 Jahren 0
Könnte das Moov-Atom sein, ja. Wenn Sie den Speicherort wirklich ausblenden möchten, könnte die Option zum Proxy-Proxy durch PHP funktionieren, aber Sie leiten alles über einen Server, was in Bezug auf die Leistung nicht ideal ist. slhck vor 6 Jahren 0