Frage Wie stream Live-Video von einem Linux-Server?


Hier ist was ich machen möchte. Sah sich um, fand aber keine direkte Antwort. Ich habe eine Linux-Box, auf der Webseiten mit Ubuntu / MySQL / Apache laufen. Ich habe auch meine eigene statische IP, d. H. Verwende kein Webhosting. Ich möchte in der Lage sein, den Video-Feed von einer Webcam auf einem Laptop (vermutlich Windows) auf meinen Linux-Server zu streamen und die Nutzer einer meiner Websites in die Lage zu versetzen, das Video live zu sehen, während es gestreamt wird. Offensichtlich müsste der Laptop irgendwie mit dem Server authentifiziert werden, aber es sollte keine Beschränkungen geben, wer das Live-Video auf der Webseite sehen könnte. Vielen Dank.


30
2017-07-07 14:50


Ursprung


Fragen Sie, wie Sie eine solche Lösung implementieren oder ob Sie eine fertige Lösung von Drittanbietern suchen? Im ersten Fall ist SO der falsche Ort für diese Frage, ich glaube, das ist der Grund für die Ablehnung


Antworten:


Ich entwickle derzeit Online-Streaming von 3 über FireWire angeschlossenen miniDV-Kameras, die Ihren Anforderungen sehr ähnlich sind.

Kurzer Hinweis: vlc + flowplayer / jw player

Zunächst gibt es zwei Videoformate, die Sie im Online-Streaming verwenden können: FLV und h264. FLV ist einfacher zu transcodieren, h264 hat ein besseres Größen- / Qualitätsverhältnis, aber Transcodierung ist viel mehr CPU-Verbrauch. Beide können von Flash-Playern auf der Webseite angezeigt werden.

Zweitens, Streaming-Infrastruktur. Da Ihre Bandbreite vom Laptop begrenzt ist (paar Mbit / s), müssen Sie auf Ihren Server streamen und dort an die Clients senden. So wird der Stream 1 mal zum Server und dann N mal zu Clients von dort fließen. Sie haben Ihre Internetverbindung für Ihren Laptop nicht beschrieben, daher ist das Szenario in zwei Abschnitte unterteilt:

  1. Laptop ist mit der öffentlichen IP-Adresse verbunden oder Sie können den NAT-Port mit dem Laptop verbinden. Dieses Szenario ist viel einfacher, da Sie eine Verbindung von Server zu Laptop einfach und bequem herstellen können. Ein großer Nachteil ist, dass Sie an einen Ort gebunden sind (eine IP-Adresse).

  2. Laptop ist nicht mit der öffentlichen I-Adresse verbunden. Dies ist ein wenig knifflig, funktioniert aber von jedem Netzwerk aus, das Ihnen erlaubt, SSH zu Ihrem Server zu betreiben und einen ausreichenden Upload zu haben (1 Mbps sollte es tun).

Unabhängig vom verwendeten Szenario sieht der Infrastructure so aus

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Streaming vom Laptop

  1. Video von der Webcam aufnehmen. Ich habe noch nie einen Stream von einer lokal angeschlossenen Webcam erfasst, aber es gibt viele Beispiele, wie man das über V4L macht, zum Beispiel: Webcam einrichten. Der einzige Teil, an dem Sie interessiert sein sollten, ist:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Was ist der erste Teil des VLC-Befehls, um eine Verbindung zur Webcam herzustellen? Für weitere Details folgen Sie dem erwähnten HOWTO. Sehen Sie sich speziell den Teil "Video Group" an und korrigieren Sie den Gerätepfad zu / dev / video und / dev / audio. Diese können auf Ihrem Laptop anders sein.

  2. Video in FLV umwandeln. Ich persönlich benutze FLV, da es weniger CPU-Anforderungen stellt. Die Transcodierungszeichenfolge, die ich verwende, ist folgende:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Das wird Video-Stream in FLV-Format mit MPGA-Audio transkodieren (MP3 ist in meinem Ubuntu nicht verfügbar). Samplerate ist irgendwie obligatorisch, ohne sie geht es nicht. Aber Sie können wählen, kleiner, wie 22050. Dies wird Video-Stream "wie es ist" transcodieren, so dass die Skala 1: 1 ist. Sie können Breiten- und Höhenparameter oder sogar Skalierungsparameter anhängen. Schauen Sie in die VLC-Dokumentation.

  3. Streame es vom Laptop. Jetzt müssen Sie einen lokalen Stream erstellen, auf dem sich der Server verbinden wird:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Dadurch wird der VLC-Stream an 0.0.0.0:8081/stream.flv gebunden. Der ganze Befehl wird so aussehen:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Auf dem Server restreaming

  1. Capture Stream auf dem Server und retream es. Auch hier verwenden wir VLC zum Aufnehmen und Streamen. Die Verwendung basiert auf dem Infrastruktur-Szenario von Anfang dieses Posts. Wie ich gezeigt habe, streamt VLC auf Laptop Videos auf einem Port. Dieser Port muss vom Server erreichbar sein. Wenn Sie eine öffentliche IP-Adresse eines Laptops oder NAT-Ports haben, können Sie es mit Telnet testen:

    server$ telnet public_ip_address 8081

    Alles außer "Verbindungs-Timeout" zeigt an, dass Sie sich mit dem Strom Ihres Laptops verbinden können. Wenn Sie keine öffentliche IP-Adresse haben oder keinen NAT-Port haben, müssen Sie umgekehrt vorgehen. Sie können SSH von Laptop zu Server und remote Ihren Laptop-Port zum Server weiterleiten. Der korrekte SSH-Befehl wäre:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Dieser magische Befehl wird Ihren Laptop-Port 8081 an den Server-Port 8081 "binden". Das heißt, wenn Sie sich auf dem Server mit 8081 verbinden, werden Sie sich stillschweigend über SSH-Tunnel mit Ihrem Laptop-Port 8081 verbinden. Cool was?:) Alles, was wir tun müssen, ist einfach VLC verbinden und streamen:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Oder im Falle einer öffentlichen IP-Adresse oder eines NAT-Ports:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Wie im Laptop-Teil ist Ihr VLC auf dem Server an Port 8082 gebunden. Warum 8082 und nicht 8081? 8081 ist bereits von der SSH-Fernbedienung übernommen worden. Warum verwenden wir den Transcodeteil nicht wie im ersten Beispiel? Das Video ist bereits im richtigen Format, also müssen wir es nur so streamen, wie es ist.

  2. Testen. In beiden Beispielen können Sie die Funktionalität testen, indem Sie Streams über VLC anzeigen. Sie können Ihren lokalen Stream testen:

    laptop$ vlc http://localhost:8081/stream.flv

    Und Sie können den Stream Ihres Servers testen:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    In beiden Fällen sollten Sie Ihre Webcam-Eingabe sehen.

Zeigen Sie den Stream im Web an

Der Stream im Web wird in den meisten Fällen über den Flash Player angezeigt. Ich habe zwei Produkte ausprobiert, die für nicht-kommerzielle Nutzung kostenlos sind: JW Spieler und Flowplayer. Ich blieb bei Flowplayer, aber ich erinnere mich nicht an den Grund, vielleicht wegen Plugins (die ich nicht benutze :) oder wegen besserer Dokumentation.

Wie man den FLV-Stream von VLC auf der Webseite anzeigt, ist hier beschrieben: Streame VLC zur Website mit asf und Flash

Fehlerbehebung

Beachten Sie viele Probleme, die entstehen werden. Das erste, wie in allem, lesen. VLC ist sehr gesprächig Programm, so wird es Ihnen sagen, wo das Problem ist. Könnte ein Problem mit den Berechtigungen für den Zugriff auf das Video / Audio-Gerät sein, fehlende Codecs, falsch geschriebene --out Parameter, ... Lernen zu verwenden iftop um zu sehen, ob die Daten wirklich durch das Netzwerk fließen usw.


43
2017-07-08 09:45



Danke vielmals! Das waren mehr Informationen als ich erwartet hatte. Wird VLC auschecken und Ihre Informationen als Leitfaden verwenden. - dehlenbe


Mein Werkzeug der Wahl wäre hier vlc. Es ist nicht nur ein Multi-Format-Multi-Format-Video-Player, es ist auch in der Lage, in einer Vielzahl von Dateiformaten und Streaming-Protokolle zu streamen. Als Bonus funktioniert es plattformübergreifend zwischen Windows- und Linux-Hosts.

Wir haben vor ein paar Jahren etwas Ähnliches eingerichtet, bei dem ein Kunde, der eine DSL-Leitung mit schmaler Bandbreite (128 K Upstream) nutzt, seine netzwerkverbundenen Webcams einem breiten Publikum zugänglich machen musste. Eine VLC-Installation als "Reflektor" -Host hat die Cam-Signalrotation durchgeführt, die Hauptbandbreitenlast von den Streaming-Clients übernommen und den Stream in verschiedenen Streaming-Protokollen und -Formaten präsentiert.


3
2017-07-08 07:13





Nicht wirklich mein Spezialgebiet, aber vielleicht kann ich Sie in eine mögliche Richtung weisen.

Die kommerzielle Implementierung besteht aus Adobe Flash Media Server. Natürlich kann das ein ziemlich kostspieliger Ansatz sein. Es gibt jedoch Open-Source-Alternativen - wie Red5. Sie müssen den Server installieren (er hat Java-Abhängigkeiten).

Sobald Sie den Server laufen haben, können Sie Ihr Front-End auswählen (ich glaube Red5 kommt mit einigen Samples, aber Sie können auch verwenden JW Spieler mit type=camera).

Das Frontend empfängt das Streaming-Video vom Medienserver und Sie laden Ihren Stream auf den Medienserver hoch.

Weitere Informationen: Red5 Hilfe & Info und Red5 Referenz


1
2017-07-08 06:36



jwplayer ist eine tolle Sache für den persönlichen Gebrauch - Kendrick