Ich verwende seit nun etwa einem Jahr einen Raspberry Pi 3, USB-TV-Tuner und TVHeadend-Service, um überall im Haus auf jedem Gerät Fernsehen schauen zu können – eine klassische IPTV Infrastruktur. Zusätzlich kann ich damit das Fernsehprogramm aufzeichnen. Leider habe ich bei TV-Sendern im HD-Format schnell die Grenzen der kleinen Himbeere erreicht, denn ungefär alle 2-3 Minuten sind Fragmente im Bild. Zum einen dürfte dies an der geringen Bandbreite (TV-Signal über USB in die Beere und dann via LAN-Kabel weiter) und der sowieso geringen Systemleistung liegen. Probleme, die ein oDroid XU4 nicht unbedingt hat. Neben der wesentlich höheren Performance, ist das LAN mit GBit angebunden. Die oDroid XU4 TVHeadend Installation verlief bei mir größtenteils reibungslos, ist aber natürlich abhängig von dem TV-Tuner. Die Konfiguration hingegen hat ihre Tücken. Folgend möchte ich euch erklären, was dabei zu beachten ist.

Was wird benötigt?

* hierbei handelt es sich um Affiliatelinks. Das bedeutet, dass ich im Falle eines Kaufes Ihrerseits einen geringen Prozentsatz des Kaufpreises als Vermittlungsgebühr erhalte. Für Sie entstehen dabei keinerlei Mehrkosten.

Welchen TV-Tuner man genau benötigt hängt natürlich davon ab, wovon man das TV-Signal anzapfen möchte. In meinem Fall handelt es sich um Kabelfernsehen aus der Dose von meinem Regionalanbieter wilhelm.tel. Es gibt erhebliche Unterschiede was die Treiber-Verfügbarkeit für Linux bei den verschiedenen USB-Tunern angeht, weshalb ich im folgenden Tutorial leider nur Bezug auf meinen nehmen kann.

Zum Abspielen an den Fernsehern verwende ich hauptsächlich FireTV Sticks*, als auch FireTV Boxen*. Einfach Kodi auf dem FireTV installieren und dann unter AddOns „Tvheadend HTSP Client“ installieren und konfigurieren.

oDroid XU4 einrichten und Treiber installieren

Ich habe meinen oDroid frisch aufgesetzt mit dem neuesten Ubuntu 18.04 Image (20180531, MINIMAL, BARE OS), dass es aktuell (August 2018) gibt. Die aktuellsten Images für den oDroid XU4 findet man immer im offiziellen Hardkernel Wiki. Die Prozedur wie man ein Image installiert gibt es im Internet zu Hauf, darauf verzichte ich also.

Unter dem frisch installierten Betriebssystem habe ich mich erstmal darauf konzentriert den Treiber des Tuners zum Laufen zu bekommen. Sobald das läuft, hat man sich keine falschen Mühen mit der Kompilierung von TVHeadend gemacht. Als ersten Schritt muss man herausfinden, welchen Chip der USB-Tuner hat. Meistens kann man diesen dann bei Google eingeben und findet dazu passende Treiber für Linux. Gebt folgenden Befehl in die Shell ein:

root@odroid:~# lsusb Bus 001 Device 002: ID 0572:0320 Conexant Systems (Rockwell), Inc. DVBSky T330 DVB-T2/C tuner 1 2 root @ odroid : ~ # lsusb Bus 001 Device 002 : ID 0572 : 0320 Conexant Systems ( Rockwell ) , Inc . DVBSky T330 DVB - T2 / C tuner

Der DVBSky T330 Chip wird in sehr vielen USB-TV-Tunern verbaut. Es kann also gut möglich sein, dass du einen komplett anderen Stick erworben hast und dennoch den selben Chip vorfindest. In diesem Fall hast du Glück, denn Treiber für diesen Chip werden hervorragend für Linux gepflegt. Unter http://www.dvbsky.net/Support_linux.html findet man eine kurze Übersicht, was es zu installieren gibt. Ich habe jeweils den „Upstream Driver“ und die Firmware eingespielt. Dies geht wie folgt.

# Upstream Driver installieren git clone git://linuxtv.org/media_build.git cd media_build ./build make install # Firmware installieren mkdir -p /tmp/dvbfw/ && cd /tmp/dvbfw/ apt update && apt install unzip wget http://www.dvbsky.net/download/linux/firmware.zip unzip firmware.zip chmod +x copy_firmware.sh ./copy-firmware.sh # Firmware durch Neustart laden reboot 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # Upstream Driver installieren git clone git : // linuxtv .org / media_build .git cd media_build . / build make install # Firmware installieren mkdir - p / tmp / dvbfw / && cd / tmp / dvbfw / apt update && apt install unzip wget http : // www .dvbsky .net / download / linux / firmware .zip unzip firmware .zip chmod + x copy_firmware .sh . / copy - firmware .sh # Firmware durch Neustart laden reboot

Nach erfolgtem Neustart sollte der Kernel die nötige Firmware und Treiber geladen haben. Am besten testen wir dies gleich. Genutzt habe ich dazu das Kommandozeilen-Programm „w-scan“. Es ist in den Paketquellen zu finden und wird wie folgt installiert.

apt update && apt install w-scan 1 apt update && apt install w - scan

Mit dem Befehl w_scan -c DE -fc -X lässt sich dann testen, ob wir auf den Fernseh-Frequenzen ein Signal finden. Mit -c DE setzen wir das Land, mit -fc nutzen wir DVB-C und mit -C UTF-8 setzen wir das Encoding. Falls man anstelle von DVB-C etwas anderes verwendet, gibt es noch folgende Möglichkeiten:

root@odroid:~# w_scan --help -f type, --frontend type What programs do you want to search for? a = atsc (vsb/qam) c = cable s = sat t = terrestrian [default] 1 2 3 4 5 6 7 root @ odroid : ~ # w_scan --help - f type , -- frontend type What programs do you want to search for ? a = atsc ( vsb / qam ) c = cable s = sat t = terrestrian [ default ]

Wenn alles funktioniert sieht es in etwa so aus (Auszug):

root@odroid:~# w_scan -c DE -fc -C UTF-8 w_scan -c DE -fc -C UTF-8 w_scan version 20170107 (compiled for DVB API 5.10) using settings for GERMANY DVB cable DVB-C scan type CABLE, channellist 7 output format vdr-2.0 output charset 'UTF-8' Info: using DVB adapter auto detection. /dev/dvb/adapter0/frontend0 -> CABLE "Silicon Labs Si2168": very good :-)) Using CABLE frontend (adapter /dev/dvb/adapter0/frontend0) -_-_-_-_ Getting frontend capabilities-_-_-_-_ Using DVB API 5.10 frontend 'Silicon Labs Si2168' supports INVERSION_AUTO QAM_AUTO FEC_AUTO FREQ (42.00MHz ... 870.00MHz) SRATE (1.000MSym/s ... 7.200MSym/s) -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 73000: sr6900 (time: 00:00.024) sr6875 (time: 00:01.556) 81000: sr6900 (time: 00:06.128) sr6875 (time: 00:07.672) 113000: sr6900 (time: 00:12.240) signal ok: QAM_AUTO f = 113000 kHz S6900C999 (0:0:0) QAM_AUTO f = 113000 kHz S6900C999 (0:0:0) : updating network_id -> (0:41030:0) new transponder: (QAM_256 f = 634000 kHz S6900C0 (41030:41030:42)) 0x4044 new transponder: (QAM_64 f = 642000 kHz S6900C0 (1:41030:1093)) 0x4044 new transponder: (QAM_64 f = 650000 kHz S6900C0 (1:41030:1089)) 0x4044 new transponder: (QAM_256 f = 658000 kHz S6900C0 (1:41030:1011)) 0x4044 new transponder: (QAM_256 f = 666000 kHz S6900C0 (41030:41030:14)) 0x4044 new transponder: (QAM_256 f = 674000 kHz S6900C0 (41030:41030:15)) 0x4044 new transponder: (QAM_256 f = 682000 kHz S6900C0 (41030:41030:16)) 0x4044 new transponder: (QAM_256 f = 690000 kHz S6900C0 (41030:41030:47)) 0x4044 new transponder: (QAM_256 f = 698000 kHz S6900C0 (41030:41030:21)) 0x4044 new transponder: (QAM_256 f = 706000 kHz S6900C0 (41030:41030:19)) 0x4044 new transponder: (QAM_256 f = 714000 kHz S6900C0 (41030:41030:20)) 0x4044 new transponder: (QAM_256 f = 722000 kHz S6900C0 (133:41030:6)) 0x4044 new transponder: (QAM_256 f = 730000 kHz S6900C0 (133:41030:12)) 0x4044 new transponder: (QAM_256 f = 738000 kHz S6900C0 (133:41030:13)) 0x4044 new transponder: (QAM_256 f = 746000 kHz S6900C0 (1:41030:1201)) 0x4044 new transponder: (QAM_256 f = 754000 kHz S6900C0 (41030:41030:24)) 0x4044 new transponder: (QAM_256 f = 762000 kHz S6900C0 (41030:41030:25)) 0x4044 new transponder: (QAM_256 f = 770000 kHz S6900C0 (41030:41030:26)) 0x4044 new transponder: (QAM_256 f = 290000 kHz S6900C0 (41030:41030:36)) 0x4044 new transponder: (QAM_256 f = 306000 kHz S6900C0 (1:41030:1051)) 0x4044 new transponder: (QAM_256 f = 314000 kHz S6900C0 (41030:41030:31)) 0x4044 new transponder: (QAM_256 f = 322000 kHz S6900C0 (41030:41030:32)) 0x4044 new transponder: (QAM_256 f = 330000 kHz S6900C0 (1:41030:1025)) 0x4044 new transponder: (QAM_256 f = 362000 kHz S6900C0 (41030:41030:27)) 0x4044 new transponder: (QAM_256 f = 370000 kHz S6900C0 (1:41030:1019)) 0x4044 new transponder: (QAM_256 f = 378000 kHz S6900C0 (133:41030:9)) 0x4044 new transponder: (QAM_64 f = 386000 kHz S6900C0 (1:41030:1101)) 0x4044 new transponder: (QAM_64 f = 394000 kHz S6900C0 (1:41030:1079)) 0x4044 new transponder: (QAM_64 f = 402000 kHz S6900C0 (1:41030:1073)) 0x4044 new transponder: (QAM_256 f = 410000 kHz S6900C0 (133:41030:3)) 0x4044 new transponder: (QAM_256 f = 418000 kHz S6900C0 (133:41030:4)) 0x4044 new transponder: (QAM_256 f = 426000 kHz S6900C0 (133:41030:2)) 0x4044 [..] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 root @ odroid : ~ # w_scan -c DE -fc -C UTF-8 w_scan - c DE - fc - C UTF - 8 w_scan version 20170107 ( compiled for DVB API 5.10 ) using settings for GERMANY DVB cable DVB - C scan type CABLE , channellist 7 output format vdr - 2.0 output charset 'UTF-8' Info : using DVB adapter auto detection . / dev / dvb / adapter0 / frontend0 - > CABLE "Silicon Labs Si2168" : very good : - ) ) Using CABLE frontend ( adapter / dev / dvb / adapter0 / frontend0 ) - _ - _ - _ - _ Getting frontend capabilities - _ - _ - _ - _ Using DVB API 5.10 frontend 'Silicon Labs Si2168' supports INVERSION_AUTO QAM_AUTO FEC_AUTO FREQ ( 42.00MHz . . . 870.00MHz ) SRATE ( 1.000MSym / s . . . 7.200MSym / s ) - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ - _ 73000 : sr6900 ( time : 00 : 00.024 ) sr6875 ( time : 00 : 01.556 ) 81000 : sr6900 ( time : 00 : 06.128 ) sr6875 ( time : 00 : 07.672 ) 113000 : sr6900 ( time : 00 : 12.240 ) signal ok : QAM_AUTO f = 113000 kHz S6900C999 ( 0 : 0 : 0 ) QAM_AUTO f = 113000 kHz S6900C999 ( 0 : 0 : 0 ) : updating network_id - > ( 0 : 41030 : 0 ) new transponder : ( QAM_256 f = 634000 kHz S6900C0 ( 41030 : 41030 : 42 ) ) 0x4044 new transponder : ( QAM_64 f = 642000 kHz S6900C0 ( 1 : 41030 : 1093 ) ) 0x4044 new transponder : ( QAM_64 f = 650000 kHz S6900C0 ( 1 : 41030 : 1089 ) ) 0x4044 new transponder : ( QAM_256 f = 658000 kHz S6900C0 ( 1 : 41030 : 1011 ) ) 0x4044 new transponder : ( QAM_256 f = 666000 kHz S6900C0 ( 41030 : 41030 : 14 ) ) 0x4044 new transponder : ( QAM_256 f = 674000 kHz S6900C0 ( 41030 : 41030 : 15 ) ) 0x4044 new transponder : ( QAM_256 f = 682000 kHz S6900C0 ( 41030 : 41030 : 16 ) ) 0x4044 new transponder : ( QAM_256 f = 690000 kHz S6900C0 ( 41030 : 41030 : 47 ) ) 0x4044 new transponder : ( QAM_256 f = 698000 kHz S6900C0 ( 41030 : 41030 : 21 ) ) 0x4044 new transponder : ( QAM_256 f = 706000 kHz S6900C0 ( 41030 : 41030 : 19 ) ) 0x4044 new transponder : ( QAM_256 f = 714000 kHz S6900C0 ( 41030 : 41030 : 20 ) ) 0x4044 new transponder : ( QAM_256 f = 722000 kHz S6900C0 ( 133 : 41030 : 6 ) ) 0x4044 new transponder : ( QAM_256 f = 730000 kHz S6900C0 ( 133 : 41030 : 12 ) ) 0x4044 new transponder : ( QAM_256 f = 738000 kHz S6900C0 ( 133 : 41030 : 13 ) ) 0x4044 new transponder : ( QAM_256 f = 746000 kHz S6900C0 ( 1 : 41030 : 1201 ) ) 0x4044 new transponder : ( QAM_256 f = 754000 kHz S6900C0 ( 41030 : 41030 : 24 ) ) 0x4044 new transponder : ( QAM_256 f = 762000 kHz S6900C0 ( 41030 : 41030 : 25 ) ) 0x4044 new transponder : ( QAM_256 f = 770000 kHz S6900C0 ( 41030 : 41030 : 26 ) ) 0x4044 new transponder : ( QAM_256 f = 290000 kHz S6900C0 ( 41030 : 41030 : 36 ) ) 0x4044 new transponder : ( QAM_256 f = 306000 kHz S6900C0 ( 1 : 41030 : 1051 ) ) 0x4044 new transponder : ( QAM_256 f = 314000 kHz S6900C0 ( 41030 : 41030 : 31 ) ) 0x4044 new transponder : ( QAM_256 f = 322000 kHz S6900C0 ( 41030 : 41030 : 32 ) ) 0x4044 new transponder : ( QAM_256 f = 330000 kHz S6900C0 ( 1 : 41030 : 1025 ) ) 0x4044 new transponder : ( QAM_256 f = 362000 kHz S6900C0 ( 41030 : 41030 : 27 ) ) 0x4044 new transponder : ( QAM_256 f = 370000 kHz S6900C0 ( 1 : 41030 : 1019 ) ) 0x4044 new transponder : ( QAM_256 f = 378000 kHz S6900C0 ( 133 : 41030 : 9 ) ) 0x4044 new transponder : ( QAM_64 f = 386000 kHz S6900C0 ( 1 : 41030 : 1101 ) ) 0x4044 new transponder : ( QAM_64 f = 394000 kHz S6900C0 ( 1 : 41030 : 1079 ) ) 0x4044 new transponder : ( QAM_64 f = 402000 kHz S6900C0 ( 1 : 41030 : 1073 ) ) 0x4044 new transponder : ( QAM_256 f = 410000 kHz S6900C0 ( 133 : 41030 : 3 ) ) 0x4044 new transponder : ( QAM_256 f = 418000 kHz S6900C0 ( 133 : 41030 : 4 ) ) 0x4044 new transponder : ( QAM_256 f = 426000 kHz S6900C0 ( 133 : 41030 : 2 ) ) 0x4044 [ . . ]

oDroid XU4 TVHeadend kompilieren

Nachdem wir uns nun vergewissert haben, dass die Treiber richtig laufen und der Stick ein Fernsehsignal einfangen kann, können wir uns endlich der Kernanwendung zuwenden: TVHeadend. Das oDroid XU4 TVHeadend Setup ist relativ einfach, leider ist aber eine selbstständige Kompilierung von Nöten, da zum aktuellen Zeitpunkt (24. August ’18) keine Pakete für Ubuntu 18.04 in den zuständigen Paketquellen sind. Aber alles halb so wild, es sind nur wenige Befehle die alles selbstständig erledigen. Zu aller erst installieren wir alle Abhängigkeiten:

apt update && apt install git build-essential debhelper pkg-config fakeroot libavahi-client-dev libssl-dev zlib1g-dev liburiparser-dev python cmake dvb-apps libcurl14-gnutls-dev liburiparser-dev libavcodec-dev 1 apt update && apt install git build - essential debhelper pkg - config fakeroot libavahi - client - dev libssl - dev zlib1g - dev liburiparser - dev python cmake dvb - apps libcurl14 - gnutls - dev liburiparser - dev libavcodec - dev

Und los geht’s:

# Git Repo herunterladen git clone https://github.com/tvheadend/tvheadend.git ~/build/tvheadend/master # In Ordner wechseln cd ~/build/tvheadend/master/ # wir wollen die letzte Stable Version (aktuell 4.2) # # um herauszufinden, welche die letzte Stable Version ist, # muss man sich die Branches der GitHub Seite ansehen git checkout release/4.2 # Kompiliervorgang starten ./configure AUTOBUILD_CONFIGURE_EXTRA=--disable-bintray_cache\ --disable-ffmpeg_static ./Autobuild.sh # auf dem oDroid XU4 TVHeadend installieren cd ~/build/tvheadend/ dpkg -i tvheadend_4.2.6-16~g42e737f28_armhf.deb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Git Repo herunterladen git clone https : //github.com/tvheadend/tvheadend.git ~/build/tvheadend/master # In Ordner wechseln cd ~ / build / tvheadend / master / # wir wollen die letzte Stable Version (aktuell 4.2) # # um herauszufinden, welche die letzte Stable Version ist, # muss man sich die Branches der GitHub Seite ansehen git checkout release / 4.2 # Kompiliervorgang starten . / configure AUTOBUILD_CONFIGURE_EXTRA =-- disable - bintray_cache \ -- disable - ffmpeg_static . / Autobuild . sh # auf dem oDroid XU4 TVHeadend installieren cd ~ / build / tvheadend / dpkg - i tvheadend_4 . 2.6 - 16 ~ g42e737f28_armhf . deb

Wie man sieht habe ich ffmpeg deaktiviert, da ich es damit leider nicht zum Laufen bekommen habe. Offenbar wird es u.A. zum Komprimieren (Transcoding) des Datenstroms verwendet. Da ich aber nur in meinem Heimnetz schaue, ist es in meinem Fall nicht nötig, da die Bandbreiten ausreichen. Sollte es jemand zum Laufen bekommen, kann derjenige sich aber gerne in den Kommentaren melden 🙂

Nun läuft auf dem oDroid XU4 TVHeadend. Sollte das nicht der Fall sein, kann man es mit systemctl start tvheadend starten. Das Autobuild-Skript legt nämlich ein Start/Stop Skript für uns an und sorgt gleichzeitig dafür, dass tvheadend unter einem eigenen Benutzer läuft.

Sendersuchlauf starten

Man kann das Web-Interface von TVHeadend fortan unter der IP des oDroids und dem Port 9981 erreichen. Zuerst loggt man sich mit den Zugangsdaten ein, die man im Installationsvorgang festgelegt hat und wird dann direkt von einem Einrichtungsassistenten begrüßt. Dieser begleitet einen durch den ersten Sendersuchlauf.

Ich habe mir die Zeit erspart und einfach die alten Konfigs meines Raspberry Pi 3 eingespielt. Für wen dies auch relevant ist: einfach den Ordner /home/hts/.hts vom alten Gerät auf den oDroid XU4 übertragen und TVHeadend neustarten. Beim normalen Weg mit dem Einrichtungsassistenten sollte man auf keine Probleme stoßen, solange die Treiber richtig laufen und w_scan Fernsehsignale entdecken kann.

Fazit

Nun ist auf unserem oDroid XU4 TVHeadend. Die Konfiguration für’s Aufnehmen und TimeShifting ist unkompliziert (Configuration -> Recording).

Ich denke bereits darüber nach mir einen zweiten USB-TV-Tuner zuzulegen, denn sobald der Stick genutzt wird um fern zu sehen oder etwas aufzunehmen, kann man keinen anderen Fernsehsender mehr betrachten.

Aber ansonsten sehe ich im Vergleich zu meinem RPi3 keine Fragmente mehr im Bild, also hat sich die Migration schon aus dem Grund gelohnt. Getestet habe ich das alles auf einer extra microSD-Karte. Zum Schluss musste ich also alles wieder auf meinen eMMC Speicher migrieren. Wie dies funktioniert, habe ich bereits in dem Beitrag oDroid XU4: Migration von microSD zu eMMC Speicher erläutert.

Ähnliche Beiträge: