Tvheadend auf dem Raspberry Pi

Ja, jetzt hat’s auch mich erwischt: ich habe mir einen Raspberry Pi gekauft… Schuld daran ist mal wieder die c’t mit diesem Artikel: Fernseh-Bringdienst: TV-Server Tvheadend versorgt PCs und Mobilgeräte

Kurzfassung: Schließt man einen USB-Satelliten-Receiver (geht aber auch mit Kabeltunern oder DVB-T-Sticks) an den Raspberry Pi an, kann man mit geeigneter Software das Programm ins eigene Hausnetz streamen und so dann auf allen Laptops, PCs, Tablets und Smartphones anschauen. Die begrenzten Fähigkeiten des Raspi reichen dafür aus, weil das Bild auf dem Client dekodiert wird, der Raspi also wirklich nur die empfangenen digitalen Daten durchreichen muss. Das funktioniert auch mit Sendern, die keinen Livestream anbieten und/oder über Zattoo etc. nicht verfügbar sind, und auch, wenn die eigene Internetanbindung zu langsam ist für einen klötzchenfreien Stream. Wenn man noch eine Festplatte an den Raspi anschließt, kann man auch aufnehmen, was ich bis jetzt aber noch nicht probiert habe.

Zumindest das Fernsehbild-Streaming habe ich bei mir jetzt am laufen, und zu Dokumentationszwecken folgt hier eine Kurzfassung, wie es geht. Es gibt da nämlich ein paar Stolperfallen, auf die im c’t-Artikel nicht näher eingegangen wird…

Benötigte Hardware

  • Raspberry Pi (gibt es für <40EUR bei Reichelt, RS, Amazon…)
  • SD-Karte für das OS auf dem Raspi. 4GB reichen völlig. Achtung: Der Raspi ist wohl etwas wählerisch; es gibt Karten, mit denen er nicht oder nicht zuverlässig booten mag. D.h. entweder einen Raspi im Set mit vorbespielter SD-Karte kaufen oder in dieser Liste nachschauen: http://elinux.org/RPi_SD_cards
  • Netzteil für den Raspi. Hier reicht im Prinzip irgendein USB-Handy-Ladegerät, das bis zu 1.2A bei 5V liefert, und ein Micro-USB-Anschlußkabel. Sowas hatte ich noch zuhause rumliegen, kann man aber auch mit dem Raspi mitbestellen.
  • Gehäuse für den Raspi, damit er nicht als blanke Platine rumliegt. Da gibt es bei den üblichen Verdächtigen eine große Auswahl. Man sollte sich aber die Bewertungen und Kommentare anschauen: Bei manchen Gehäusen sind die Aussparungen an den Buchsen recht klein, sodass man schon sehr schlanke Stecker an den Kabeln haben muss, sonst kriegt man da nix gesteckt. Wer den Raspi evtl. übertakten möchte, sollte ein Gehäuse mit Lüftungsschlitzen wählen. Es gibt auch Kühlkörper-Sets zu kaufen, das ist dann sicher auch keine schlechte Idee.
  • USB-Satelliten-Receiver. Ich habe den Technisat Skystar USB HD verwendet, da der vom Linux-Kernel direkt unterstützt wird. Das Teil gibt es wieder bei den üblichen Verdächtigen, Kostenpunkt ca. 45EUR. Wer ein anderes Modell einsetzen will, sollte vorher genauestens recherchieren, wie es mit der Linux-Unterstützung aussieht, und zwar mit Linux auf ARM-Targets. Nur weil es einen Treiber geht, der auf Intel-CPUs funktioniert, heißt das noch lange nicht, dass der dann auch auf dem Raspberry funktioniert. Also am besten googlen und ein bekannt funktionierendes Gerät kaufen.
  • Für’s erste Rumprobieren ganz nett: Ein Display mit HDMI-Anschlußkabel und eine USB-Tastatur. Beides kann man dann direkt an den Raspi anschließen.

Alles zusammengerechnet kommt man wohl mit knapp unter 100EUR aus.

Software-Installation

  • Der Raspi braucht zunächst einmal ein Betriebssystem. Ich habe mir das Leben einfach gemacht und die vom Hersteller zur Verfügung gestellte Debian-Variante Raspbian installiert. Die gibt es hier kostenlos zum Download: http://www.raspberrypi.org/downloads
  • Das Image wird entpackt und unter Windoof mittels des Programms Win32DiskImager auf die SD-Karte gedübelt. Das scheint sowas wie „dd“ für Windoof zu sein.
  • SD-Karte einstecken, Strom, Netzwerk, HDMI anstöpseln, und die Kiste bootet schonmal. Per SSH kann man dann mit Login pi und Passwort „raspberry“ connecten (man muss halt noch im Webfrontend des Routers nachsehen, welche IP per DHCP zugewiesen wurde). Beim ersten Login kommt ein Hinweis, dass man mit dem Tool „raspi-config“ noch etwas Konfigurationsarbeit leisten muss/kann, beispielsweise das Tastaturlayout und die Zeitzone verstellen.
  • Ein paar essentielle Dinge braucht es noch: sudo apt-get install dselect vim (’schulligung, ich *KANN* ohne vim nicht arbeiten!)
  • Den TVheadend-Server gibt es als Debian-Package fertig installtionsbereit, allerdings nicht in den Standard-Raspbian-Quellen. Man muss also erstmal eine neue Paketquelle hinzufügen usw. Alternativ kann man auch die neueste Version über die git-Quellen selbst kompilieren. Zusammengefasst ist das hier: http://www.forum-raspberrypi.de/Thread-tutorial-tvheadend-serve. Da Weblinks bekanntlich vergänglich sind, zur Sicherheit hier nochmal das Wichtigste in Kürze:
    echo "deb http://apt.tvheadend.org/stable wheezy main" >> /etc/apt/sources.list
    wget http://apt.tvheadend.org/stable/repo.gpg.key -O - | sudo apt-key add -
    apt-get update
    apt-get install tvheadend
  • Es sollten noch jede Menge andere Pakete mitinstalliert werden. Irgendwann wird man nach einem Admin-User und -passwort für TVheadenend gefragt, das sollte man sich dann natürlich merken (*doh*).
  • Anschließend sollte Tvheadend schonmal laufen, zu erkennen an einem Eintrag in der Ausgabe von „ps aux“. Auch das Webfrontend sollte jetzt per http auf dem Port 9981 erreichbar sein: http://raspi.ip:9981/

Jetzt ist eigentlich alles drauf, was man an Software braucht.

Vorbereiten des Receivers

Der Receiver wird standardmäßig bereits vom Kernel unterstützt und beim Anstecken erkannt (yeah!). Allerdings braucht er noch eine Firmware, damit er funktioniert. Die gibt es hier zum Download: http://kernellabs.com/firmware/technisat-usb2. Diese .fw-Datei holt man sich am besten auf dem Raspi selbst per wget und kopiert sie nach /lib/firmware. Wenn man den Receiver anschließend neu ansteckt, sollte im syslog sowas in dieser Art auftauchen:

Jan  4 12:59:46 raspberrypi kernel: [ 1654.246991] dvb-usb: found a 'Technisat SkyStar USB HD (DVB-S/S2)' in cold state, will try to load a firmware
Jan  4 12:59:46 raspberrypi kernel: [ 1654.274740] usbcore: registered new interface driver dvb_usb_technisat_usb2
Jan  4 13:01:40 raspberrypi kernel: [ 1769.039728] usb 1-1.2: USB disconnect, device number 5
Jan  4 13:01:44 raspberrypi kernel: [ 1772.345698] usb 1-1.2: new high-speed USB device number 6 using dwc_otg
Jan  4 13:01:44 raspberrypi kernel: [ 1772.446260] usb 1-1.2: New USB device found, idVendor=14f7, idProduct=0500
Jan  4 13:01:44 raspberrypi kernel: [ 1772.446297] usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Jan  4 13:01:44 raspberrypi kernel: [ 1772.457106] technisat-usb2: set alternate setting
Jan  4 13:01:44 raspberrypi kernel: [ 1772.955578] dvb-usb: found a 'Technisat SkyStar USB HD (DVB-S/S2)' in cold state, will try to load a firmware
Jan  4 13:01:44 raspberrypi kernel: [ 1772.955890] dvb-usb: downloading firmware from file 'dvb-usb-SkyStar_USB_HD_FW_v17_63.HEX.fw'
Jan  4 13:01:45 raspberrypi kernel: [ 1773.136280] usb 1-1.2: USB disconnect, device number 6
Jan  4 13:01:45 raspberrypi kernel: [ 1773.136705] dvb-usb: generic DVB-USB module successfully deinitialized and disconnected.
Jan  4 13:01:46 raspberrypi kernel: [ 1774.905771] usb 1-1.2: new high-speed USB device number 7 using dwc_otg
Jan  4 13:01:46 raspberrypi kernel: [ 1775.007333] usb 1-1.2: New USB device found, idVendor=14f7, idProduct=0500
Jan  4 13:01:46 raspberrypi kernel: [ 1775.007366] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan  4 13:01:46 raspberrypi kernel: [ 1775.007388] usb 1-1.2: Product: TechniSat USB device
Jan  4 13:01:46 raspberrypi kernel: [ 1775.007405] usb 1-1.2: Manufacturer: TechniSat Digital
Jan  4 13:01:46 raspberrypi kernel: [ 1775.007421] usb 1-1.2: SerialNumber: 0008C9F0ADE1
Jan  4 13:01:46 raspberrypi kernel: [ 1775.018152] technisat-usb2: set alternate setting
Jan  4 13:01:46 raspberrypi kernel: [ 1775.018500] technisat-usb2: firmware version: 17.63
Jan  4 13:01:46 raspberrypi kernel: [ 1775.018526] dvb-usb: found a 'Technisat SkyStar USB HD (DVB-S/S2)' in warm state.
Jan  4 13:01:46 raspberrypi kernel: [ 1775.019282] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
Jan  4 13:01:46 raspberrypi kernel: [ 1775.019964] DVB: registering new adapter (Technisat SkyStar USB HD (DVB-S/S2))
Jan  4 13:01:46 raspberrypi kernel: [ 1775.021518] dvb-usb: MAC address: 00:08:c9:f0:ad:e1
Jan  4 13:01:47 raspberrypi kernel: [ 1775.193516] stv6110x_attach: Attaching STV6110x
Jan  4 13:01:47 raspberrypi kernel: [ 1775.266401] usb 1-1.2: DVB: registering adapter 0 frontend 0 (Technisat SkyStar USB HD (DVB-S/S2))...

Das heißt: Receiver ist erkannt, Firmware geladen, we are ready to go!

Konfiguration von Tvheadend

  1. Im Webinterface einloggen
  2. unter „Configuration/Access Control“ erstmal einen neuen User zum TV-Schauen anlegen (der darf dann nur Streamen und aufnehmen, sonst nix)
  3. dann ins Register „DVB Inputs“. Dort sollte in der Dropdown-Liste der Technisat-Receiver auftauchen. Rechts Haken bei „enabled“ und „auto-detect muxes“ setzen, dann links auf „Add DVB Network for location“ gehen und dann „Astra-19.2E“ auswählen.
  4. klickt man auf „Save“, wird nach Muxes gesucht. Auf der rechten Seite gibt es „Muxes awaiting initial scan:“, das zählt langsam runter (Bei mir sind’s 108 Muxes und 1648 Services).
  5. klickt man dann links auf „Map DVB services to channels“ werden alle gefundenen Sender angewählt und gecheckt. Verschlüsselte werden rausgeworfen sowie Datenkanäle, mit denen wir nix anfangen können. Das DAUERT, bei mir ein paar Stunden. Geduld, Geduld… mir ist der Raspi dabei auch mehrfach abgestürzt…
  6. anschließend Haken bei „IDLE Scanning“ entfernen und speichern
  7. Jetzt die Service-Liste unter „Services“ aufräumen. Das Interface wird schneller, wenn man Spalten ausblendet (in der Kopfzeile der Tabelle klicken und in der sich dann öffnenden Drop-Down-Liste „Columns“ wählen, dort alles abschalten, was nicht dringend notwendig ist). Hier den Haken bei „Enable“ bei allen uninteressanten Sachen entfernen.
    Alternativ kann man das auch VOR dem Mapping machen, dann geht selbiges schneller, weil man vorab gleich einen Sack von Services vom Scan ausschließen kann.
  8. In den Settings des DVB-Sources sollte man noch die Option „Full Mux Reception“ auf „off“ schalten. So wie ich es verstehe, werden sonst die Daten des gesamten Muxes empfangen und vom Raspi vor dem Streamen aussortiert. Ruckelfreies Playback habe ich nur hinbekommen, wenn das abgestellt war. Angeblich ist dann die CPU-Last geringer, das konnte ich bei mir aber nicht feststellen. So oder so ist die ist die Last beim Streamen eines HD-Kanals bei ~50% (wenn sonst nichts auf dem Raspi läuft, d.h. keine anderen Dienste ausser Systemdienste und SSH).
  9. Weiterer Tipp: in den DVB-Settings die Option „Skip Initial Scan“ anhaken, sobald alles fertig konfiguriert ist. Andernfalls scannt der Raspi bei jedem Booten oder Neustart von TVheadend alle Muxe durch. Dauert, frist CPU-Power, ist unnütz (wenn sich nicht gerade die Senderbelegung geändert hat, dann kann man das ja mal händisch anstoßen)

Hardware-Probleme

Bei mir gab es zu Beginn zwei Probleme beim Booten des Raspberry Pi:

  1. HDMI ging nach dem PowerUp oft nicht, obwohl das Teil gebootet hatte und anschließend per Netzwerk erreichbar war. Problem ist scheinbar, dass mein Display sich per HDMI zu langsam meldet, der Raspi dann davon ausgeht, dass kein HDMI-Device angesteckt ist, und dann HDMI ab- und stattdessen Composite anschaltet. Lösung: In der Datei /boot/config.txt die Zeile hdmi_force_hotplug=1 auskommentieren (d.h. Kommentarzeichen entfernen). Dann geht auch Hot-Plugging eines Displays zu einem späteren Bootzeitpunkt.
  2. Das Ding bootete prinzipiell nur sporadisch nach dem Powerup überhaupt. Über HDMI werden dann nur 4 Pixel ausgegeben (die der Monitor dann zu einem schönen Regenbogen-Viereck interpoliert). Da scheint ein Problem mit der Stromversorgung vorzuliegen: diese 4 Pixel werden wohl bei der GPU-Initialisierung ausgegeben, und wenn dann irgendwas mit der Versorgung nicht stimmt, bleibt er an der Stelle hängen. Möglicherweise ist das Problem, dass mein Netzteil den Strom nicht schnell genug hochfährt. Ich habe allerdings in meinem Fundus von geschätzt 10 USB-Netzteilen kein einziges gefunden, bei dem es verläßlich funktioniert hätte (auch nicht z.B. mit USB-Hubs mit Netzteil). Lösung: In der Datei /boot/config.txt die Zeile boot_delay=1 hinzufügen, damit funzt es bei mir jetzt stabil. Möglicherweise hat die Versorgung damit dann genug Zeit, hochzufahren, bevor richtig viel Saft gebraucht wird? Ich weiß es nicht…

Clients zum Anschauen

Auf PCs kann man den http://-Link zum jeweiligen Sender (den man sich im Tvheadend-Webfrontend rauskopieren kann) mit zahlreichen Playern als Netzwerkstream öffnen: VLC, MPlayer sind so die üblichen Verdächtigen. VLC kann man auch direkt aus dem Webfrontend heraus starten mit Klick auf den Sender. Es wird dann das VLC-Browserplugin gestartet, um den Stream zu öffnen. Das funktioniert allerdings bei mir aus unerfindlichen Gründen nicht.

Auf PC/Laptop geht es aber auch mit VLC alleine recht komfortabel, indem man das HTSP-Plugin nachinstalliert. Wie das funktioniert, ist hier beschrieben: https://tvheadend.org/boards/4/topics/8509.

Auf Tablets/Smartphones geht’s auch mit VLC. Problem ist nur, wie man die notwendigen Links für die Sender herbekommt. Ich habe mir die Mühe gemacht, eine kleine HTML-Datei mit Links zu den wichtigsten Sendern zu basteln. Die kann man auf so ziemlich jedem Gerät mit dem Browser öffnen, und beim Anklicken des Links dann mit einem passenden Programm öffnen lassen. Für iOS-Geräte gibt es eine HTSP-App namens „TvhClient“, die wiederum auf dem VLC für iOS aufbaut. Die App funktioniert aus unerfindlichen Gründen auf meinem iPhone kategorisch nicht, auf dem iPad geht’s aber.

Problem bei iOS-Geräten: Ich habe noch keines gefunden, das HD-Streams ruckelfrei abspielt, zumindest nicht mit VLC (und auch nicht mit allen anderen Playern, die ich getestet habe). Ich befürchte, dass VLC und Co. zum Dekodieren nicht die Hardwarebeschleunigung verwenden (dürfen) und die CPU zu langsam zum Dekodieren in Software ist.

Fazit

  1. Es funktioniert!
  2. Kosten: ca. 90EUR
  3. Zeitaufwand: halber Tag
  4. Was geht:
    • Sender auf Laptops, PCs, Tablets und Smartphones streamen, auch HD-Sender
    • Gleichzeitiges Streamen desselben SD-Senders auf mehrere Geräte (bei mir geht’s mit 3)
    • Gleichzeitiges Streamen von 2 verschiedenen SD-Sendern auf dem gleichen Mux an zwei unterschiedliche Geräte
  5. Was nicht geht:
    • gleichzeitiges Streamen eines HD-Senders auf mehrere Endgeräte
    • gleichzeitiges Streamen mehrere Sender von unterschiedlichen Muxes (logisch, is ne Sat-Einschränkung, aber ich will’s mal gesagt haben)
    • Dekodieren von HD-Streams auf iPad2 und iPhone 4S/5 mittels VLC. Bisher habe ich keinen Client/Player gefunden, der unter iOS ruckelfrei dekodiert, obwohl das von der Hardware her gehen müsste. Ich befürchte, dass keiner wegen irgendwelcher Apple-Restriktionen für sowas die Hardwarebeschleunigung verwenden kann.
  6. Was gehen müsste, aber noch nicht getestet ist:
    • Platte an den Raspi anschließen und darauf Streams aufzeichnen
    • Abspielen aufgezeichneter Streams