Kabelfernsehen über den Raspberry Pi 2 an das Smartphone streamen
28.05.2017
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).
Um sowohl den Fernseher als auch den Raspberry Pi mit Kabel zu versorgen empfiehlt sich ein TV-Verteiler.
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:
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":
# 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.
# 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 https://www.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.
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.
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.
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:
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
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:
cd /home/pi/tools
# download the television script
wget https://www.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:
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.
# 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.