Archive for November 6th, 2006

Fernsehen übers Internet

Heute möchte ich mich mal nicht über die schlechte Welt auslassen, sondern ein kleines How-To schreiben, in dem erklärt wird, wie man Fernsehen bequem über das Netz streamt. Und das alles wird mit einer DVB-Karte und dem VLC bewerkstelligt.

Angefangen hat ja alles bei der Fußball-WM. Meine lieben Arbeitskollegen wollten sich einen kleinen DVB-T-USB-Stick zulegen. Doch haben sie leider nicht bedacht, dass man einen Tag vor dem Anpfiff wohl nicht mehr loszugehen braucht.

Also stellte sich die Frage, wie die Spiele in der Firma denn zu empfangen wären.

Und da kommt der gute alte VLC ins Spiel. Ich demonstriere hier, wie es unter Gentoo Linux funktioniert, es sollte aber auch bei allen anderen Distributionen laufen. Voraussetzung ist jedoch, dass die DVB-Karte im Rechenknecht ordnungsgemäß funktioniert.

Zuallererst brauchen wir eine aktuelle VLC-Version:

emerge -av media-video/vlc

Und jetzt beginnt der ganze Spaß. Auf den Seiten von VLC gibt es zwar ein Tutorial, wie man streamen kann, allerdings ist das für den Heimgebrauch ein wenig komplex. Ich will hier exemplarisch mal zwei Szenarien behandeln. Nämlich das

  • Streamen im heimischen Netzwerk und
  • Streamen über das Internet mit begrenzter Bandbreite

Erst einmal braucht man mal die genaue Programmbelegung. Die findet man im Internet im VDR-wiki. Ich nehme hier exemplarisch die Frequenztabelle für Hamburg. Und aus dieser Tabelle nehme ich mal den Sender “Pro Sieben”. Für den steht dort eingetragen:

ProSieben:546000:I999B8C23D23M16T8G4Y0:T:27500:305:306;312:311:0:16403:0:0:0

Was wir aus diesen Informationen brauchen, sind die Frequenz (546000) und die Programmnummer (16403). Die Frequenz steht immer nach dem ersten Doppelpunkt und die Programmnummer findet man immer an der viertletzten Stelle.

Um jetzt im lokalen Netzwerk das Fernsehsignal zu senden, ruft man VLC folgendermaßen auf:

vlc -vvv --color --ts-es-id-pid --program=16403 dvb: --dvb-frequency=546000000 --dvb-bandwidth=8 --sout-standard-access=http --sout-standard-mux=asf --sout '#duplicate{dst="standard{access=http,mux=asf,url=Serveradresse“,select=”program=16403″}’

Wobei Serveradresse eine Adresse und ein Port des lokalen Servers sein sollten. Bei mir wäre das z.B. 192.168.100.7:333. Jetzt würde mein VLC das ProSieben-Signal auf Port 333 meines Rechners in das Netz schmeißen.

Austesten kann man das, indem man an einem andern Rechner im lokalen Netz

vlc http://192.168.100.7:333

eingibt. Es sollte ein Fernsehsignal erscheinen.

So, nach der Pflicht kommt die Kunst. Da selbst mein Internetanschluss im Höchstfall 80 KB/s senden kann, muss man sich natürlich überlegen, wie man das 2 - 7 MBit Signal kleinkriegt. Auch hier kann uns VLC wieder helfen. Wir bauen eine Option ein, die sich “transcode” nennt, und das Signal in “Echtzeit” umwandelt. Hierbei muss man allerdings beachten, dass man nicht sinnlose Kombinationen der Codecs herstellt (z.B. MPEG1-Video mit OGG-Audio). Eine Tabelle gibt es hier. Die zweite Tabelle zeigt die Möglichkeiten auf.

Jetzt erweitern wir unsere Kommandozeile einfach um die “transcode”-Option:

vlc -vvv --color --ts-es-id-pid --program=16403 dvb: --dvb-frequency=546000000 --dvb-bandwidth=8 --sout-standard-access=http --sout-standard-mux=asf --sout '#transcode{vcodec=mp4v,vb=500,scale=0.66,acodec=mp3,ab=64,channels=1,deinterlace}:duplicate{dst="standar
d{access=http,mux=asf,url=192.168.100.7:6666}”,select=”program=16403″}’

Zugegebenermaßen ist das sehr unübersichtlich, also nehmen wir mal die Zeile mit dem transcode heraus:

transcode{vcodec=mp4v,vb=500,scale=0.66,acodec=mp3,ab=64,channels=1,deinterlace}

vcodec meint den Videocodec, der zum Encodieren genutzt wird. Bei mir ist das MPEG4-Video.
vb ist die Bitrate, die ich erzielen möchte.
scale skaliert das Bild. Bei mir auf 2/3 der Orginalgröße
acodec setzt den Encoder für das Audiosignal. Hier MP3.
ab ist die Audio-Bitrate. Fürs Fernsehen reicht 64 kbit/s.
channels setzt die Anzahl der Audiokanäle. Bei mir ist es Mono.
deinterlace eliminiert das Zeilensprungverfahren. Ist aber nicht notwendig.

Da einem diese ganze Tipparbeit ganz schon auf den Docht gehen kann, habe ich mir für jedes Programm ein kleines Script angefertigt. Dies muss ich nur in der Konsole aufrufen und schon kann ich fernsehen. Das geht zum Beispiel ganz prima, wenn man per SSH den VLC-Server startet und in weiter Ferne (z.B. auf Arbeit) fernsehen kann.

Ein Script für ProSieben sieht z.B. so aus:


#!/bin/bash
vlc \
-vvv –color –ts-es-id-pid \
–program=16403 \
dvb: \
–dvb-frequency=546000000 –dvb-bandwidth=8 \
–sout-standard-access=http –sout-standard-mux=asf \
–sout ‘#transcode{vcodec=mp4v,vb=500,scale=0.66,acodec=mp3,ab=64,channels=1,deinterlace}\
:duplicate{dst=”standard{access=http,mux=asf,url=192.168.100.7:6666}”,select=”program=16403″}’
exit

Hierbei habe ich auch einen anderen Port an meinem Server vergeben (6666), damit ich eindeutig weiß, dass das Signal fürs Internet ist.

Jetzt kann man ganz bequem in der Konsole das Fernsehprogramm mit


./local.vlc.start.pro7

starten und an einem anderen Rechner genießen.

Übrigens muss man auch noch einen Port in der Firewall öffnen, damit das Signal nach draußen kommt.

Viel Spaß beim Fernsehen

P.S. Ich weiß nicht, ob die Fernsehübertragung gebührenpflichtig ist oder wie die Gesetzeslage dazu aussieht. Mir geht es nur darum, die technische Machbarkeit vorzustellen.
Ich hätte ja auch gerne meine Scripte hier angehängt, aber wordpress will wohl nicht so, wie ich…