Ulrichs Werkbank

Live-TV-Streaming in Eigenregie

18. September 2017
von Ulrich Hilger
alle Rechte vorbehalten

 

In Zeiten von 'Video on demand' ist die Kombination mit der Live-Charakterisitik des Fernsehens eine verlockende und naheliegende Maßnahme. Die nahezu allgegenwärtige Verfügbarkeit eines Zugangs zum Netz und immer-dabei-Mobilgeräten wie Schlaufon und Tafelrechner erübrigt die Notwendigkeit, immer ein Fernsehgerät bereitzuhalten und verändert die tradierte Form des Fernsehens: Ein Rechner mit TV-Empfänger an zentraler Stelle und dessen Live-TV-Signal wird einfach von unterwegs aus über das Netz auf dem Schlaufon aufgerufen und schon sind Bild und Ton live und in Echtzeit jederzeit und überall im Zugriff.

Ein Live-TV-Streaming erfordert nicht zwingend die Nutzung eines entsprechenden Dienstleisters im Internet. Hier einmal die Betrachtung einer Lösung auf der Grundlage eines Linux-Rechners, die aus der Vielzahl möglicher Lösungsansätze einen herausgreift, der schnell und unkompliziert zum Ziel führt.

Voraussetzungen
TV-Empfang vorbereiten
TV-Empfang starten
TV-Signal verkleinern und ins Netz senden
Live-TV aus dem Netz ansehen
Beenden des TV-Empfangs, Sender umschalten
Fazit

Voraussetzungen

Zum Transport von Fernsehsendungen ins Netz genügen: 

Bei der Auswahl eines passenden TV-Empfängers ist beispielsweise das Wiki von Ubuntuusers hilfreich. Dort ist auch erwähnt, ob für das Gerät der Wahl ein Treiber existiert und wie er nötigenfalls installiert wird. Ob letztlich die Hardware am eigenen Linux-Rechner erkannt wurde, läßt der Befehl ls /dev/dvb auf der Kommandozeile erkennen. Gibt er die Antwort adapter0 zurück, wurde der Empfänger ins System eingebunden und ist bereit für Wiedergabe und Aufzeichnung.

TV-Empfang vorbereiten

Damit TV-Inhalte empfangen werden können, muss zunächst ein Sendersuchlauf mit dem Programm w_scan stattfinden und dessen Ergebnis für die Verwendung mit dem im nächsten Abschnitt beschriebenen Programm gnutv aufbereitet werden. Diese Schritte sind im Artikel TV-Aufnahmen mit dem Rechner beschrieben.

TV-Empfang starten

Mit dem Programm gnutv wird der Empfang von Sendungen aus dem Fernsehen eingeschaltet und ein kontinuierlicher Datenstrom mit dem Live-Signal eines gewählten Senders erzeugt. gnutv kann dabei den Datenstrom direkt ins Netz leiten, allerdings ist der Datenstrom vom TV-Empfänger umfangreicher als nötig. Er soll deshalb zunächst als Eingangsdatenstrom für eine Kompression dienen. Das folgende Kommando startet gnutv als Hintergrundprozess in der erforderlichen Weise

gnutv -channels /pfad/zur/channels.conf -out rtp 127.0.0.1 8181 DasErste

Mit diesem Kommando wird zeitlich unbegrenzt das Live-TV-Signal des Senders DasErste als RTP-Datenstrom an Port 8181 der lokalen Maschine gesendet. Die Einstellungen, die gnutv zum Empfang des gewünschten Senders benötigt, werden aus der Datei channels.conf entnommen. Eine Änderung der Senderbelegung kann so einfach in dieser Datei hinterlegt werden, ohne, dass das obige Kommando geändert werden muss.

TV-Signal verkleinern und ins Netz senden

Das von gnutv kommende TV-Signal im Format MPEG-TS ist sehr umfangreich und sollte vor der Übetragung an andere Geräte im Netz komprimiert werden. Das Programm Video LAN Client (vlc) liefert hierzu die passenden Funktionen. Es wird zusätzlich zu gnutv als weiterer Hintergrundprozess wie folgt gestartet.

cvlc rtp://127.0.0.1:8181 --daemon --pidfile "/pfad/zum/pidfile/cvlc.pid" --network-caching 2000 --sout '#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/}' --sout-all --sout-keep

Der etwas längliche Befehl passt hier im Text nicht auf eine Zeile, muss aber als eine einzelne Befehlszeile ausgeführt werden. Er bewirkt, dass der von gnutv kommende Datenstrom des TV-Programmes in das Format MPEG-4 übertragen und komprimiert wird. Das komprimierte Signal wird kontinuierlich als RTSP-Strom am Port 8554 ins Netz übertragen.

Obiger Befehl läßt sich zwar auch direkt aus einem Java-Programm heraus starten, der cvlc-Prozess bricht aber aus einem bislang nicht genau feststellbaren Grund nach kurzer Zeit ab. Schreibt man das Kommando hingegen in ein Shell-Skript (Linux) oder Batch-Skript (Windows) und führt dieses Skript aus Java heraus aus, funktioniert auch der Aufruf aus einem eigenen Java-Steuerprogramm.

Deshalb ist im obigen Kommando der Parameter --pidfile enthalten. Er bewirkt, dass die eindeutige Kennung des cvlc-Prozesses in die im Parameter angegebene Datei geschrieben wird. Mit dieser Kennung läßt sich der Prozess aus Java heraus beenden, wenn das Abspielen des TV-Signals enden soll.

Zum Abspielen direkt in einem Webbrowser ist das rtsp-Protokoll nicht geeignet. Hierfür muss eine andere Übertragungsmethode genutzt werden. Eine Alternative zum Abspielen im Browser ist das folgende Kommando

cvlc rtp://127.0.0.1:8181 --daemon --pidfile "/pfad/zum/pidfile/cvlc.pid" --network-caching 1600 --sout '#transcode{vcodec=theo,vb=32 scale=0.5,acodec=vorb,ab=128,channels=2,samplerate=44100}:standard{access=http{mime=video/ogg}, dst=:8554/, mux=ogg}' --sout-all --sout-keep --sout-http-mime=video/ogg

Live-TV aus dem Netz ansehen

Jedes ans Netz angeschlossene Gerät kann nun den ins Netz gestreamten TV-Inhalt abspielen, vorausgesetzt, für das Abspielgerät ist der Rechner 'sichtbar', auf dem der cvlc-Prozess aus dem vorigen Abschnitt läuft. Um beispielsweise das Live-TV-Signal mit einem Raspberry Pi abzuspielen und auf einem dort angeschlossenen Monitor nebst Lautsprechern wiederzugeben kann auf dem betreffenden Raspberry Pi das folgende Kommando verwendet werden.

omxplayer -o local rtsp://tv-server:8554/

Annahme im obigen Beispiel ist, dass die Maschine, von der aus der cvlc-Prozess ins Netz streamt, unter dem Namen tv-server erreichbar ist. Die betreffende Maschine kann stattdessen einen beliebigen anderen Namen haben.

Auf dieselbe Weise kann mit dem obigen URL rtsp://tv-server:8554/ a das Programm vlc auf einem tragbaren Rechner als Abspieler verwendet werden. Es gibt vlc auch für Schlaufone und Tafelrechner, aber andere Abspielprogramme für Videos auf Mobilgeräten können zum Teil ebenfalls Streaming-Inhalte abspielen.

Beenden des TV-Empfangs, Sender umschalten

Um den TV-Empfang zu stoppen, werden einfach die beiden Prozesse gnutv und cvlc beendet. Das kann von Hand auf der Kommandozeile geschehen (Strg-C oder kill -15 [prozessnr.]) oder z.B. per Skript.

Die Prozesse können unter Verwendung der angegebenen Kommandos auch aus einem Java-Programm gestartet werden, z.B. mit

Process p = Runtime.getRuntime().exec("gnutv -channels usw.");

Dann wird der Prozess einfach mit p.destroy() gestoppt.

Zum Umschalten des Senders wird der Empfang wie beschrieben gestoppt und mit Angabe des Senders, zu dem umgeschaltet werden soll, neu gestartet.

Fazit

Mit einem einfachen Linux-Rechner nebst TV-Empfänger sowie gnutv und vlc lässt sich mit nur wenigen Kommandos der TV-Empfang so herstellen, dass er ohne Fernsehgerät von verschiedensten Geräten mit Netzzugang angesehen werden kann, ohne, dass diese Geräte einen TV-Empfänger haben müssen. Ist der Rechner, von dem aus der TV-Empfang erfolgt, im Netz 'sichtbar', kann auf diese Weise an jedem Ort mit Netzzugang Live-TV ganz ohne Fernsehgerät angeschaut werden. 

Mit wenigen Handgriffen ist so beispielweise der TV-Empfang Zuhause in Räumen ohne Antennenanschluss an Kabel- oder Sat-Empfang oder auch unterwegs über das Netz möglich.

Werden die Kommandos in ein eigenes Steuerprogramm eingebettet, ist zudem die Bedienung per Web-App und Schlaufon möglich.