Wie streame ich Live-Videos von einem Linux-Server?

30

Folgendes möchte ich tun. Sah sich um, fand aber keine klare Antwort. Ich besitze eine Linux-Box, auf der Websites mit Ubuntu / MySQL / Apache ausgeführt werden. Ich habe auch meine eigene statische IP, dh ich verwende kein Webhosting. Ich möchte den Video-Feed von einer Webcam auf einem Laptop (vermutlich unter Windows) auf meinen Linux-Server streamen und den Benutzern einer meiner Websites ermöglichen, das Video live als Stream zu sehen. Natürlich müsste sich der Laptop irgendwie beim Server authentifizieren, aber es sollte keine Einschränkungen geben, wer das Live-Video auf der Website sehen darf. Vielen Dank.


quelle
Fragen Sie, wie eine solche Lösung implementiert werden soll, oder suchen Sie nach einsatzbereiten Lösungen von Drittanbietern? im vorigen Fall ist SO der falsche Ort für diese Frage, ich glaube, es ist der Grund für die Ablehnung

Antworten:

46

Derzeit entwickle ich Online-Streaming von 3 über FireWire verbundenen MiniDV-Kameras, was Ihren Anforderungen ziemlich ähnlich ist.

Kurztipp: VLC + Flowplayer / JW Player

Zunächst gibt es zwei Videoformate, die Sie für das Online-Streaming verwenden können: FLV und h264. FLV ist einfacher zu transkodieren, h264 hat ein besseres Verhältnis von Größe und Qualität, aber das Transkodieren ist viel CPU-intensiver. Beide können von Flash-Playern auf der Webseite angezeigt werden.

Zweitens Streaming-Infrastruktur. Da die Bandbreite Ihres Laptops begrenzt ist (ein paar MBit / s), müssen Sie den Stream auf Ihren Server übertragen und dort auf die Clients übertragen. Der Stream wird also 1 Mal zum Server und dann N Mal von dort zu den Clients fließen. Sie haben Ihre Internetverbindung für Ihren Laptop nicht beschrieben, daher ist das Szenario in zwei Abschnitte unterteilt:

  1. Der Laptop ist mit einer öffentlichen IP-Adresse verbunden, oder Sie können einen NAT-Port für den Laptop einrichten . Dieses Szenario ist viel einfacher, da Sie eine schöne und einfache Verbindung vom Server zum Laptop herstellen können. Ein großer Nachteil ist, dass Sie an einen Ort (eine IP-Adresse) gebunden sind.

  2. Der Laptop ist nicht mit der öffentlichen I-Adresse verbunden . Dies ist ein bisschen knifflig, funktioniert jedoch in jedem Netzwerk, in dem Sie SSH auf Ihren Server übertragen können und über einen ausreichenden Upload verfügen (1 Mbit / s sollten dies tun).

Unabhängig vom verwendeten Szenario sieht der Infrastrukturer folgendermaßen 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 aufgenommen, aber es gibt viele Beispiele, wie dies über V4L geschehen kann, z . B .: Webcam-Setup . Der einzige Teil, den Sie interessieren sollten, ist:

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

    Welches 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 insbesondere den Teil "Videogruppe" an und korrigieren Sie den Gerätepfad zu / dev / video und / dev / audio. Diese können auf Ihrem Laptop unterschiedlich sein.

  2. Video in FLV umcodieren . Ich persönlich benutze FLV, da es weniger CPU-Anforderungen stellt. Die von mir verwendete Transcode-Zeichenfolge lautet:

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

    Damit wird der Videostream mit MPGA-Audio in das FLV-Format umgewandelt (MP3 ist in meinem Ubuntu nicht verfügbar). Samplerate ist irgendwie obligatorisch, es geht nicht ohne. Sie können jedoch auch eine kleinere Größe auswählen, z. B. 22050. Dadurch wird der Videostream so wie er ist transkodiert, sodass der Maßstab 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, über den der Server eine Verbindung herstellt:

    :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 gesamte Befehl sieht folgendermaßen aus:

    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 neu streamen

  1. Erfasse den Stream auf dem Server und streame ihn erneut . Auch hier verwenden wir VLC zum Erfassen und Streamen. Die Verwendung basiert auf dem Infrastrukturszenario von Anfang dieses Beitrags. Wie ich gezeigt habe, überträgt VLC auf einem Laptop Video auf einen Port. Dieser Port muss vom Server aus erreichbar sein. Wenn Sie eine öffentliche IP-Adresse eines Laptops oder eines NAT-Ports haben, können Sie diese mit Telnet testen:

    server$ telnet public_ip_address 8081

    Alles außer "Verbindungs-Timeout" zeigt, dass Sie eine Verbindung zum Stream Ihres Laptops herstellen können. Wenn Sie keine öffentliche IP-Adresse haben oder keinen NAT-Port haben, müssen Sie umgekehrt vorgehen. Sie können von Laptop zu Server SSH und Ihren Laptop-Port von einem entfernten Standort zum Server weiterleiten. Der richtige SSH-Befehl wäre:

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

    Dieser magische Befehl "bindet" Ihren Laptop-Port 8081 an den Server-Port 8081. Wenn Sie also eine Verbindung auf dem Server zu 8081 herstellen, stellen Sie über einen SSH-Tunnel eine stille Verbindung zu Ihrem Laptop-Port 8081 her. Cool, oder? :) Alles was wir tun müssen ist einfaches 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 bei öffentlicher IP-Adresse oder NATed-Port:

    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-Server an Port 8082 gebunden. Warum 8082 und nicht 8081? 8081 wird bereits von der SSH-Gegenstelle weitergeleitet. Warum verwenden wir den Transcode-Teil nicht wie im ersten Beispiel? Das Video hat bereits das richtige Format. Alles, was wir tun müssen, ist es so zu 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 sollte Ihre Webcam-Eingabe angezeigt werden.

Stream im Web anzeigen

Die Anzeige des Streams im Web, die in den meisten Fällen funktioniert, erfolgt über den Flash Player. Ich habe zwei Produkte ausprobiert, die für den nichtkommerziellen Gebrauch kostenlos sind: JW Player und Flowplayer . Ich bin bei Flowplayer geblieben, aber ich erinnere mich nicht an den Grund, vielleicht wegen Plugins (die ich nicht benutze :)) oder wegen einer besseren Dokumentation.

Hier erfahren Sie, wie Sie den FLV-Stream von VLC auf einer Webseite anzeigen: Stream von VLC zur Website mit asf und Flash

Fehlerbehebung

Achten Sie auf viele Probleme, die auftreten werden. Als erstes, wie in allem, lesen . VLC ist ein sehr gesprächiges Programm, das Ihnen sagt, wo das Problem liegt. Könnte ein Problem mit den Zugriffsberechtigungen für das Video- / Audiogerät sein, fehlende Codecs, falsch geschriebene --sout-Parameter usw. Erfahren Sie, wie Sie feststellen, iftopob die Daten wirklich über das Netzwerk übertragen werden.

mkudlacek
quelle
1
Vielen Dank! Das waren mehr Informationen als ich erwartet hatte. Wir werden VLC auschecken und Ihre Informationen als Leitfaden verwenden.
3

Mein Werkzeug der Wahl wäre hier VLC . Es ist nicht nur ein Mehrzweck-Videoplayer mit mehreren Formaten, sondern kann auch in einer Vielzahl von Dateiformaten und Streaming-Protokollen streamen. Als Bonus funktioniert es plattformübergreifend unter Windows- und Linux-Hosts.

Wir haben vor ein paar Jahren etwas Ähnliches eingerichtet, bei dem ein Kunde, der eine DSL-Leitung mit geringer Bandbreite (128 K Upstream) verwendet, seine mit dem Netzwerk verbundenen Webcams an ein breites Publikum streamen lassen musste. Bei einer VLC-Installation als "Reflektor" -Host wurde das Nockensignal gedreht, die Hauptbandbreitenlast von den Streaming-Clients übernommen und der Stream in verschiedenen Streaming-Protokollen und Formaten dargestellt.

das-wabbit
quelle
1

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

Bei der kommerziellen Implementierung wird der Flash Media Server von Adobe verwendet. Dies kann natürlich 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 wird mit einigen Beispielen geliefert, aber Sie können auch JW Player mit verwenden type=camera).

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

Weitere Informationen: Red5 Help & Info und Red5 Reference

cyberx86
quelle
Jwplayer ist eine tolle Sache für den persönlichen Gebrauch
Kendrick