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.
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 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.
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.
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.
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.
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/
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
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.
So haben wir unser Ziel erreicht:
Der Hosting-Rechner läuft unter Windows 10.
{% 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 %}
{% 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 %}
{% 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 %}
{% c-block language="markdown" %}
cd /snap/janus-gateway/current/opt/janus/share/janus/demos
python -m SimpleHTTPServer 8000
{% c-block-end %}
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.