Du bist hier:Start»Linux»Raspberry Pi»Kabelfernsehen

Kabelfernsehen über den Raspberry Pi 2 an das Smartphone streamen

28.05.2017

Raspberry Pi Mediacenter

Vor einem Jahr habe ich einen Artikel über das Streamen von DVB-T geschrieben. Mittlerweile wurde DVB-T abgeschaltet und ich bin auf Kabelfernsehen - also DVB-C - umgestiegen. Der Raspberry Pi 2 kann durch einen USB-Stick für DVB-C zu einem digitalen Videorekorder erweitert werden. Durch die Software VLC kann das Fernsehprogramm auf ein Smartphone über das WLAN-Netzwerk gestreamt werden. In folgendem Artikel wird die dafür erforderliche Konfiguration unter dem Betriebssystem Raspbian Jessie beschrieben.

Hardware

Das folgende Bild zeigt den Raspberry Pi 2 mit dem USB-Stick "TechnoTrend TT-TVStick CT2-4400". Übers WLAN kann der Raspberry das aufgenommene Fernsehen auf ein Smartphone streamen (z.B. Samsung Galaxy S3 oder S5).

Raspberry Pi mit DVB-C-Stick

Raspberry Pi mit USB-Stick für DVB-C (zum Vergrößern klicken)

Um sowohl den Fernseher als auch den Raspberry Pi mit Kabel zu versorgen empfiehlt sich ein TV-Verteiler.

TV-Splitter für Kabelfernsehen

TV-Splitter für Kabelfernsehen

USB-Stick, Stromversorgung und Firmware

Ich habe mich für den DVB-C-Stick "TechnoTrend TT-TVStick CT2-4400" entschieden, der 50 Euro kostete. Vielleicht funktionieren auch andere USB-Sticks für DVB-C - die habe ich allerdings nicht getestet. Für die Stromversorgung des Raspberry Pi ist ein Netzteil mit 2A (Ampere) und folgende Einstellung nötig:

# increase the current for USB on the pi
sudo bash

echo "max_usb_current=1" >> /boot/config.txt
reboot

Für die meisten USB-Sticks ist noch eine Firmware notwendig, die man sich aus dem Internet in das Verzeichnis /lib/firmware/ herunterladen kann. Hier ein Beispiel für den "TechnoTrend TT-TVStick CT2-4400":

sudo bash

# show kernel messages when the USB stick is plugged in:
dmesg

# get the firmware for your USB stick
wget https://github.com/OpenELEC/dvb-firmware/blob/master/firmware/dvb-demod-si2168-b40-01.fw?raw=true -O /lib/firmware/dvb-demod-si2168-b40-01.fw
wget https://github.com/OpenELEC/dvb-firmware/blob/master/firmware/dvb-tuner-si2158-a20-01.fw?raw=true -O /lib/firmware/dvb-tuner-si2158-a20-01.fw

exit

Software

Zunächst müssen einige Software-Pakete auf dem Raspberry Pi installiert und nach DVB-C-Kanälen gesucht werden.

# on the Raspberry Pi
# install necessary software packages
sudo apt-get install -y vlc vlc-nox libav-tools dvb-apps dvbstream w-scan

# scan the DVB-C network for channels - scan takes several minutes
mkdir /home/pi/.mplayer/
w_scan -fc -c DE -M > /home/pi/.mplayer/channels.conf

# for Berlin Vodafone (former Kabel Deutschland) you can download it here:
wget http://torsten-traenkner.de/linux/raspberry/channels_dvbc_vodafone_berlin.conf -O /home/pi/.mplayer/channels.conf

Am Ende des Programms "w_scan" werden Daten im Format einer channels.conf ausgegeben. Falls der Scan nicht funktioniert, kann die Datei channels.conf auch heruntergeladen werden - für Berlin z.B. hier: channels.conf. Außerdem wird noch das Video-Programm "ffmpeg" benötigt. Da es das Programm ffmpeg nicht im Repository von Raspbian gibt, muss ffmpeg selbst compiliert werden. Das Compilieren hat auf meinem Raspberry Pi 2 etwa 40 Minuten gedauert.

# build and install x264
git clone --depth 1 git://git.videolan.org/x264
cd x264
./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
make -j 4
sudo make install

# build and make ffmpeg
git clone --depth=1 git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
make -j4
sudo make install

Speicherort der Fernsehaufnahmen

Für einen definierten Speicherort der Fernsehaufnahmen empfehle ich eine Extra-Partition auf der SD-Karte anzulegen und diese als /media/storage/ einzubinden. Die MicroSD-Karte für den Raspberry Pi sollte mindestens 64 GB groß sein, damit mehrere Fernsehaufnahmen Platz haben.

# add a third partition on the Pi to store the television
sudo bash

# add an entry to the file system table
echo "/dev/mmcblk0p3  /media/storage  ext4    defaults,noatime  0       2" >> /etc/fstab

# create the mount directory
mkdir /media/storage
chown pi:pi /media/storage
mount /media/storage
exit

Schritte fürs Streaming

Die folgenden manuellen Befehle dienen zum Nachvollziehen der Schritte. Ein Skript weiter unten automatisiert diese Schritte.

# find the frequency and IDs for the television channel
grep "ZDF HD" /home/pi/.mplayer/channels.conf

# 1. Start VLC to initialize the TV stick
timeout 3 cvlc dvb-c:// :dvb-frequency=450000000 :dvb-srate=6900000 :dvb-modulation=256QAM :program=11110 --sout '#standard{access=http,mux=ts,dst=:8080}'

# 2. # record the stream as mp4
filename=/media/storage/$(date "+%F_%H-%M-%S")_television.mp4

# ARD
dvbstream -f 330000 -s 6900 -v 5101 5102 -o | ffmpeg -y -i - -acodec copy -vcodec copy -movflags empty_moov "$filename"

# or ZDF
# dvbstream -f 450000 -s 6900 -v 6110 6120 -o | ffmpeg -y -i - -acodec copy -vcodec copy -movflags empty_moov "$filename"

# 3. stream the video over the network
cvlc "$filename" --sout '#standard{access=http,mux=mpeg,dst=:8080}'

Zunächst muss aus der channels.conf die Frequenz des Fernsehprogramms im Kabel, die Samplerate, die Video-PID, Audio-PID und die Programmnummer herausgelesen werden. Mit diesen Informationen muss im 1. Schritt das Programm cvlc gestartet werden, damit der TV-Stick initialisiert wird. Einen anderen Weg habe ich noch nicht gefunden. Dann wird über dvbstream der Transportstrom (MPEG-TS) an ffmpeg weitergereicht. Das Programm "ffmpeg" wandelt den Transportstrom in eine MP4 Videodatei um ohne das Video neu zu kodieren. Das Video enthält den Videocodec H.264 mit 1280x720 Bildpunkten und 50 Bildern pro Sekunde. Der Ton ist mit AC3 - auch als Dolby Digital bekannt - kodiert. Schließlich wird im 3. Schritt cvlc benutzt um das Video übers Netzwerk zu streamen. Falls eine Firewall eingeschaltet ist, dann muss TCP-Port 8080 freigegeben werden.

Test am Computer

Der Netzwerkstream kann am Computer mit dem Programm ffplay getestet werden:

# test video streaming at your computer
http://<ip_address_of_raspberry_pi>:8080

# for example:
ffplay http://192.168.178.25:8080

Smartphone

Auf dem Smartphone kann jetzt der VLC-Player für Android installiert werden. Anschließend kann in VLC unter "Medienadresse öffnen" die URL http://<ip_adresse_des_raspberry_pi>:8080 eingetragen werden und schon kann man auf dem Smartphone fernsehen.

Netzwerkstream in VLC auswählen

Netzwerkstream in VLC auswählen

Die Größe des Smartphone-Displays stellt in der Praxis ein Problem dar. Das Fernseh-Streamen auf ein Tablet könnte eine sinnvollere Alternative sein.

Automatisierung mit Shell-Skript

Die oben beschriebenen manuellen Befehle habe ich in ein komfortables Shell-Skript geschrieben:

mkdir /home/pi/tools
cd /home/pi/tools

# download the television script
wget http://torsten-traenkner.de/linux/raspberry/stream_cable_television.sh
chmod 755 stream_cable_television.sh

# create the alias "tv" for the script
echo "alias tv='/home/pi/tools/stream_cable_television.sh'" >> /home/pi/.bashrc
source /home/pi/.bashrc

Die Fernsehaufnahme läßt sich jetzt komfortabel durch folgende Befehle starten und stoppen:

# display available channels:
tv

# start recording and streaming television (takes some seconds to start)
tv "ZDF HD"

# stop the recording
tv stop

Digitaler Videorekorder

Die Funktionalität als Videorekorder läßt sich über die Programme "crontab" oder "at" auf dem Raspberry Pi einrichten.

# regular recording with crontab

# example "Tagesschau" at 20:00 every day
crontab -l > /dev/shm/crontab.tmp
echo "58 19 * * * /home/pi/tools/stream_cable_television.sh \"Das Erste HD\"" >> /dev/shm/crontab.tmp
echo "17 20 * * * /home/pi/tools/stream_cable_television.sh stop" >> /dev/shm/crontab.tmp
crontab /dev/shm/crontab.tmp

# single video recording
echo "/home/pi/tools/stream_cable_television.sh \"ZDF HD\"" > /home/pi/atjob.txt
echo "/home/pi/tools/stream_cable_television.sh stop" > /home/pi/atjob_stop.txt
at -f /home/pi/atjob.txt 10:28 28.05.2017
at -f /home/pi/atjob_stop.txt 11:02 28.05.2017

atq

Falls du Fragen hast oder weißt, wie es mit cvlc besser funktioniert, dann kannst du die Kommentar-Funktion benutzen.

Kommentar schreiben