RTP-Streaming mit niedriger Latenz

RTP-Streaming mit niedriger Latenz
1/12/2020

Videos sind zu einer gängigen Art von Online-Inhalten geworden, und ein Video-Stream in einem Webbrowser-Fenster ist zu einer alltäglichen und gewöhnlichen Technologie geworden. Was aber, wenn eine sehr spezialisierte Anwendung, z.B. für den medizinischen oder industriellen Einsatz, ein qualitativ hochwertiges Video mit einer Latenzzeit von weniger als 1 Sekunde benötigt?

In diesem Artikel geben wir einen Leitfaden an die Hand, wie man einen Low-Layer-Stream für Web-Clients öffnet, denn das Web ist eine der besten Lösungen für Interoperabilität.

Hauptziel - niedrige Latenz

Ein Video auf einem beliebigen Gerät (in einem Webbrowser) anschauen, das als RTP-Stream mit einer Latenzzeit von weit unter einer Sekunde veröffentlicht wird.

Die Weg zum Ziel

Die erste Untersuchung endete mit der Beobachtung, dass es nicht möglich ist, RTP-Streams direkt mit einem reinen HTML-Videoplayer oder mit einem kommerziellen oder kostenlosen Webbrowser-Videoplayer anzuschauen. Das Video muss unter Verwendung von Kommunikationsprotokollen höherer Ebene wie HLS oder MPEG-DASH gestreamt werden. Videostreams auf niedriger Ebene wie RTP (oder gemuxt mit MPEG-TS) können nicht direkt verwendet werden. Das Kommunikationsprotokoll beschreibt die Wiedergabelistenstruktur für den Stream und die in Wiedergabelistensegmente aufgeteilten Streaming Daten. Eine Wiedergabeliste mit Segmenten muss auf einem Webserver veröffentlicht werden und der Videokonsument fordert regelmäßig die in der Wiedergabeliste definierten Daten an. Eine solche zusätzliche Verarbeitung verursacht zusätzliche Overhead-Kosten und erhöht die Verzögerung von der Kamera bis zum Bildschirm.  

HLS

Das HTTP-Live-Streaming-Protokoll unterteilt den Stream in Segmente, die in der m3u8-Playlist beschrieben sind und über HTTP übertragen werden. Videodaten werden mit dem H.264-Codec kodiert, Audio mit mp3 und ein MPEG-TS-Container wird für den Transport verwendet.

MPEG-DASH

Beim Dynamic Adaptive Streaming über HTTP wird der Stream in Segmente aufgeteilt und ein XML-formatiertes MPD-Manifest verwendet. Typischerweise werden die Videodaten mit dem H.264-Codec kodiert, Audio mit AAC und MP4-Container verwendet. Der Standard ist jedoch nicht an bestimmte Codecs, Protokolle oder Transport-Container zur Datenübermittlung gebunden.

Weder mit HLS noch mit MPEG-DASH ist es uns gelungen, eine Kamera zu Bildschirm Streaming Verzögerung von unter 1 Sekunde zu erreichen. Tatsächlich gibt es keine Garantie für eine Verzögerung von weniger als 1 Sekunde, aber wir haben die Grenzen der Technologie ausprobiert. Es ist wichtig zu erwähnen, dass wir empfohlene Einstellungen für das Streaming mit niedriger Latenz verwendet haben.

Das Ziel erreichen

WebRTC - Web Real-Time Communication - bietet Peer-to-Peer-Echtzeitkommunikation zwischen Webbrowsern. Es erfordert kein zusätzliches Plugin und basiert auf JavaScript-APIs. Kann eine solche Technologie für das Streaming verwendet werden? Ja, das ist möglich. Lassen Sie uns sehen wie.

Janus WebRTC server

Es handelt sich um einen allgemeinen Server, der hauptsächlich die WebRTC-Medienkommunikation mit dem Browser implementiert, über den mit dem JSON-Nachrichten über die REST-API ausgetauscht werden und der den direkten RTP-Medienkonsum unterstützt. Jede spezifische Implementierung wird durch Server-Plugins bereitgestellt. Eines der verfügbaren Plugins ist das Streaming-Plugin, das wir in unserer Lösung verwendet haben. Unsere Anforderung war, es auf einer Windows-Maschine verfügbar zu machen. Da es keinen kostenlosen WebRTC-Server für Windows gibt und der Janus WebRTC-Server nicht unter Windows läuft, haben wir WSL - Windows Subsystem für Linux - als Host verwendet.

https://janus.conf.meetecho.com/docs/

Streaming–Plugin

Das Streaming-Plugin ist unter anderem in der Lage, einen Live-RTP-Stream zu erfassen und an WebRTC-Peers zu übertragen. Für Test- und Entwicklungszwecke kann der RTP-Live-Stream einfach von FFmpeg gestreamt werden. Streams, die vom Janus Streaming-Plugin verarbeitet werden, können in "janus.plugin.streaming.jcfg" konfiguriert werden. Die behandelten Streams können auch über die mitgelieferte REST Streaming API konfiguriert werden.

https://janus.conf.meetecho.com/docs/streaming.html

Web–Client

Als Client kann ein beliebiger Web-Browser verwendet werden, der JavaScript unterstützt. Für die Kommunikation mit dem Janus WebRTC Server wird die mitgelieferte REST Streaming API des Streaming Plugins verwendet.

Die Lösung

So haben wir unser Ziel erreicht:

  • Hosting des Janus WebRTC-Servers über die WSL.
  • Konfiguration des Janus WebRTC-Servers.
  • Streaming-Quell-RTP-Stream von FFmpeg.
  • Das Ergebnis anschauen.

Der Hosting-Rechner läuft unter Windows 10.

Architektur der Lösung

Konfiguration des Hosting-Rechners:

Janus WebRTC-Server unter Linux-Distribution installieren:

  • Um die erforderlichen Abhängigkeiten und den Janus WebRTC-Server zu installieren, führen Sie die folgenden Befehle im Ubuntu-Terminal aus:

{% c-block language="markdown" %}
sudo apt-get update

sudo apt install net-tools
sudo apt install python
sudo apt install snapd

sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc
/lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

sudo snap install janus-gateway

{% c-block-end %}

Konfiguration des Linux-Distributionsnetzwerks:

  • Standardmäßig ist eine Linux-Distribution, die unter WSL läuft, außerhalb des Hosting-Rechners nicht zugänglich.
  • Um den Janus WebRTC-Server, der auf einer virtuellen Maschine mit Linux läuft, von außerhalb des Hosting-Rechners verfügbar zu machen, ist es erforderlich, die WSL Netzwerkkonfiguration auf den Bridge-Modus einzustellen. Bei Verwendung des Bridge-Modus erhält die virtuelle Maschine unter Linux eine IP-Adresse im selben LAN wie der Host-Rechner.

Hinzufügen der Stream-Definition in die Streaming-Plugin-Konfigurationsdatei:

  • Fügen Sie folgende Definition in "janus.plugin.streaming.jcfg" hinzu:

{% c-block language="markdown" %}
h264-sample: {
      type = "rtp"
      id = 10
      description = "FFmpeg stream"
      audio = false
      video = true
      videoport = 6004
      videopt = 96
      videortpmap = "H264/90000"
      videofmtp = "profile-level-id=42e01f;packetization-mode=1"
      secret = "adminpwd"}

{% c-block-end %}

Führen Sie FFmpeg aus, um den RTP-Quellstrom dem Janus WebRTC-Server zur Verfügung zu stellen:

  • FFmpeg-Tool abrufen und folgenden Befehl auf dem Host-Rechner ausführen:

{% c-block language="markdown" %}
ffmpeg -stream_loop -1 -re -i "sourceVideo.mp4" -an -vcodec copy -f rtp
rtp://<linux_ip_address>:6004?pkt_size=1316

{% c-block-end %}

Zugriff auf konfigurierten Stream:

  • Standardmäßig ist die Janus WebRTC REST API unter http://<linux_ip_address>:8088 zugänglich und es ist möglich, den Stream darüber anzuschauen.
  • Die Janus-Server-Verbindung kann in der Konfigurationsdatei "janus.transport.http.jcfg" konfiguriert werden
  • Janus enthält auch eingebaute Demos für das Streaming. Zum Ausführen der Demos starten Sie den HTTP-Server, indem Sie die folgenden Befehle in der Ubuntu-Konsole eingeben:

{% c-block language="markdown" %}
cd /snap/janus-gateway/current/opt/janus/share/janus/demos
python -m SimpleHTTPServer 8000

{% c-block-end %}

  • Siehe die Streaming Demo unter: http://<linux_ip_address>:8000/streamingtest.html

Zusammenfassung

Mit der beschriebenen Lösung sind wir in der Lage, Videos auf jedem Gerät (via Webbrowser)  anzuschauen, das als RTP-Stream beinahe in Echtzeit veröffentlicht wird (die Kamera zu Bildschirm Verzögerung liegt weit unter einer Sekunde). Die resultierende Verzögerung und die Fähigkeit, Streams mit hoher Bitrate darzustellen, hängt vom Netzwerkdurchsatz ab. Die Lösung ist in der Lage, 4k-Streams zu verarbeiten und darzustellen. Der Janus WebRTC-Server muss nicht unter WSL gehostet werden. Er kann auf einem dedizierten Linux-Rechner laufen. Es gibt keine besonderen Anforderungen an Video-Clients, es ist weder ein Plugin eines Drittanbieters noch eine nicht dem Standard entsprechende Bibliothek erforderlich. Videos lassen sich von fast jedem Webbrowser und auf den meisten Geräten (Desktop, Mobiltelefon) anschauen. Sogar eine native Desktop-Anwendung kann verwendet werden, so dass es sich um eine sehr flexible Lösung handelt.

Teilen:
Petr ist ein .NET-Entwickler mit mehr als 10 Jahren Berufserfahrung. Er konzentriert sich auf Front-End- und Back-End-Entwicklung auf der Windows-Plattform. Petr ist ein Fan von agiler Entwicklung und Teamarbeit. Außerdem mag er es, wenn ihm der Wind durchs Haar weht, sei es in historischen Autos, auf Rollschuhen oder beim Skifahren.

Weitere Artikel dieses Autors

Article collaborators

SABO Newsletter icon

SABO NEWSLETTER

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

SABO Mobile IT

Für unsere Kunden aus der Industrie entwickeln wir spezialisierte Software zur Umsetzung von Industry 4.0. IoT, Machine Learning und Künstliche Intelligenz ermöglichen uns, signifikante Effizienzsteigerungen bei unseren Kunden zu erzielen.
Über uns