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…
Und ich durfte es schon ausprobieren. Schwupi hatte mir sein TV Bild gestreamt und es hat wunderbar geklappt. Good Work
Huhu! Erstmal vielen Dank für das ausführliche Tutorial. Nun habe ich es mit einem TV Signal auch hinbekommen. Nun würde ich gerne nur eine Datei streamen. Wie sieht dafür der Befehl aus? Hab verschiedenes probiert aber irgendwie will es nicht hinhauen. Ich würde es gerne über die Kommandozeile machen, dann kann ich mir danach ein schönes Skript basteln. Würde mich über deine Hilfe oder einen Tip freuen!
Gruß Denis
Hi Denis,
eigentlich auch ganz einfach. Ich poste dir mal mein Script:
#/bin/bash
vlc -vvv -color \
--sout '#transcode{vcodec=mp4v,vb=512,scale=0.66,acodec=mp3,\
ab=64,channels=1,deinterlace}:duplicate{dst=\
"standard{access=http,mux=asf,\
url=192.168.100.7:6666}"}' $1
exit
Viel Spaß und danke für deine Anregung!
Huhu!
Super das ging ja mal schnell. Ich hätte nicht mit einer so schnellen Antwort gerechnet. Na dann werde ich gleich mal noch ein bischen mit dem Streaming spielen.
Keine Ursache!
Hmmmmm, du wirst mich nun für verrückt erklären aber ich frage als Linux Nub doch nochmal nach:
Wenn du ganz genau schaust, findest du am Ende des Scripts ein Dollar und eine eins. Das bedeutet bei einem Script, dass er das erste Argument nimmt.
In diesem Fall rufst du das Script dann einfach so auf:
./vlc.video test.mp4
Und dann sollte das schon funktionieren.
[...] Für alle, die es unter Linux ausprobieren wollen, ist diese Anleitung hilfreich Danke an zappi für den Link Tags:Übertragung Fernsehen MSN Messenger Streaming [...]
Wie sieht den das ganze in Windows aus, gibt es da auch fähige tools, habe leider kein linux
Prinzipiell ist der VLC auch unter Windows in der Lage, ein TV-Programm zu streamen. Allerdings gibt es einige Probleme beim Zugriff auf die Treiber der TV-Karte.
Da muss ich doch mal recherchieren und eventuell einen zweiten Teil schreiben. Wo krieg ich jetzt nur ein Windows her…