VDR mit DVI/VGA
Bei Röhren-TVs erfolgt(e) die Video-Einspeisung zumeist über FBAS bzw. SCART. Diese Art der Übertragung ist bei modernen Ausgabegeräten mit DVI-Anschluss (LCD/Plasma/Beamer) jedoch nicht optimal. Dieser Artikel beschreibt die notwendigen Schritte um einen VDR über DVI zu betreiben.
Als Softwarebasis dient dabei exemplarisch c't VDR 6, es sollte aber auch mit anderen Distribution auf ähnlich Weise machbar sein.
Nach einer erfolgreichen Grundinstallation von c't VDR 6 installiert man auf der Konsole als root folgende Software (entfällt bei einer Server/Client-Lösung auf dem Server):
apt-get install xorg xineliboutput-sxfe
Wenn man sich bei Auswahl des Grafikkartentreibers nicht sicher ist, gibt man vesa an, ansonsten den Treiber der dem Grafikchip entspricht (z.B. nv = nVidia Open Source Treiber). Bei der Auswahl der möglichen Bildschirmauflösungen ist zumeist die native Auflösung nicht auswählbar (z.B. 1366x768), deshalb sollte man dort zunächst nur konservative Modi wie 800x600 oder 1024x768 auswählen, mit Hilfe von neuen Modelines in der /etc/X11/xorg.conf lässt sich dies aber beheben:
Beispiel-Auszug aus xorg.conf
Section "Monitor" [...] modeline "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync modeline "1360x768@60" 80.69 1360 1400 1504 1688 768 768 770 796 modeline "1366x768@60" 80.73 1366 1408 1504 1688 768 768 770 796 EndSection Section "Screen" [...] SubSection "Display" depth 24 virtual 1366 768 modes "1366x768@60" "1360x768@60" "800x600@60" EndSubSection EndSection
Inhaltsverzeichnis |
Standalone-Lösung: ein VDR mit FF/Budget-Karte(n)
Nach der Eingabe von
xinit -e vdr-sxfe -f xvdr:tcp://localhost
sollte man am DVI-Eingang das gewohnte Fernsehbild haben.
Server/Client-Lösung: ein VDR mit FF/Budget-Karte(n) + Client(s)
Am Rechner welcher als Empfänger und damit als Datenquelle dient, muss der Streaming-Server des streamdev-plugin installiert und konfiguriert werden:
apt-get install vdr-plugin-streamdev-server
Wichtig ist dabei besonders die Freigabe der IP des Client in der streamdevhosts.conf.
Beispiel-Auszug in der setup.conf
streamdev-server.AllowSuspend = 1 streamdev-server.HTTPBindIP = 0.0.0.0 streamdev-server.HTTPServerPort = 3000 streamdev-server.HTTPStreamType = 1 streamdev-server.MaxClients = 5 streamdev-server.ServerPort = 2004 streamdev-server.StartHTTPServer = 1 streamdev-server.StartServer = 1 streamdev-server.SuspendMode = 1 streamdev-server.VTPBindIP = 0.0.0.0
Am Client muss wie oben beschrieben xorg und xineliboutput-sxfe installiert und konfiguriert werden. Ausserdem benötigt man den Streaming-Client des Streamdev-plugin:
apt-get install vdr-plugin-streamdev-client
Beispiel-Auszug aus der setup.conf
streamdev-client.RemoteIp = <IP-des-VDR-Servers> streamdev-client.RemotePort = 2004 streamdev-client.StartClient = 1 streamdev-client.StreamFilters = 1 streamdev-client.SyncEPG = 1
Auch die Installation des epgsync-plugin ist empfehlenswert. Danach kopiert man die channels.conf des Servers ins gleiche Verzeichnis des Client und restartet mit
/etc/init.d/vdr restart
Nach der Eingabe von
xinit -e vdr-sxfe -f xvdr:tcp://localhost
sollte einem dann ebenfalls ein Fernsehbild zur Verfügung stehen.
TODO
- video-Verzeichnis mit Aufnahmen vom Server einbinden
Tipps
Deinterlacing mit Hilfe von TVTime
In den VDR-Plugin-Einstellungen von xineliboutput wählt man als Methode TVTime. Es empfehlen sich 2 verschiedene Filter:
- Greedy 2 Frame bestes Ergebnis, aber selbst auf schnellen Rechnern Ruckler bei abrupten Szenenwechseln
- Linear Interpolation ebenfalls sehr gutes Bild, aber weniger empfindlich bei Bildwechseln als Greedy 2 Frame
Wenn es die CPU zulässt sollte man den Cheap Mode deaktivieren. Das Aktivieren der Judder Correction bringt zumeist nur Tonstörungen. Chroma Filter bringt ausser erhöhter CPU-Last in normaler Entfernung zum TV keine sichtbare Bildverbesserung. Das FFMpeg Processing ist normalerweise nur auf Sendern mit extrem niedriger Bitrate sinnvoll (Glättung der Klötzchen ähnlich dem Postprocessing in VLC).
Automatischer Start von xinit/vdr-sxfe
Quick & Dirty Lösung
Nach der Eingabe von crontab -e folgende Zeile einfügen
@reboot xinit -e vdr-sxfe -f xvdr:tcp://localhost
und die Datei abspeichern, danach startet die Ausgabe bei jedem Bootup.
Start via inittab
Am Ende von /etc/inittab folgende Zeile einfügen:
sxfe:23:respawn:xinit -e vdr-sxfe --reconnect -f xvdr:tcp://localhost
Autostart über WindowManager
In dem Beispiel nehme ich den Fluxbox Window Manager, da er schön schnell und klein ist, sowie den gdm Login Manager der meinen User automatisch einloggt.
apt-get install gdm fluxbox
Jetzt den gdm konfigurieren
### /etc/gdm/gdm.conf [...] [daemon] AutomaticLoginEnable=true AutomaticLogin=<username> [...]
Jetzt legen wir ein AutostartScript an, welches beim Start/Restart von Fluxbox aufgerufen wird
### /home/<username>/.fluxbox/autostart.sh vdr-sxfe --aspect=auto --fullscreen --reconnect \ --post tvtime:method=Linear,cheap_mode=1,pulldown=0,use_progressive_frame_flag=1 xvdr:tcp://localhost
Autostart Script ausführbar machen
chmod 755 /home/<username>/.fluxbox/autostart.sh
In der Config von Fluxbox muss jetzt nur noch das Script aufgerufen werden
### /home/<username>/.fluxbox/init [...] session.screen0.rootCommand: ~/.fluxbox/autostart.sh [...]
Vorteil der Autostart Methode über den Window Manager ist, das man das VDR Fenster auch mal schließen kann um auf dem Fernseher einen Browser oder VLC zu starten ohne das man erst einen Window Manager und Co starten muss.
Der Fluxbox ist so schnell und brauch nicht viele Ressourcen das der Start dem Start über xinit in fast nichts nachsteht.
Ein freundliches "Recht Maustaste (Desktop) > Restart" startet den Fluxbox Window Manager neu und damit das autostartscript (vdr-sxfe). Wer das via lirc scripten möchte brauch nur mittels irexec ein kill -HUP auf den window manager zu schicken.
Closed Source nvidia-Treiber
Es gibt zwei verschiedene Treiber: einmal die Open-Source-Variante nv und den Closed-Source-Treiber nvidia. Der CS-Treiber empfiehlt sich, wenn man das Display möglichst pixelgenau und/oder mit 50 Hz Bildwiederholfrequenz betrieben werden soll. Ausserdem erleichtern die CS-Variante die Einstellung der Auflösung ohne umständliche Berechnungen von Modelines.
Installation
Zunächst benötigen wir etwas Entwicklungssoftware zum Einbinden des Treibers:
apt-get install linux-headers-2.6-486 build-essential xorg-dev
Nun muss ein Binär-Paket von NVIDIA heruntergeladen werden. Diese findet man unter [1], dementsprechend sollte man den wget-Aufruf auf die jeweils aktuelle Version anpassen. Danach muss die Datei noch ausführbar gemacht werden bevor man sie aufruft:
wget ftp://download.nvidia.com/XFree86/Linux-x86/1.0-9755/NVIDIA-Linux-x86-1.0-9755-pkg1.run chmod +x NVIDIA-Linux-x86-1.0-9755-pkg1.run ./NVIDIA-Linux-x86-1.0-9755-pkg1.run
Die Modifikation der xorg.conf kann man getrost dem Installer überlassen, der Installer erstellt aber zur Sicherheit zuvor auch noch eine xorg.conf.backup.
Vereinfachtes Einstellen der Bildschirmauflösung
Normalerweise muss man umständlich Modelines berechnen und unter Section Monitor einfügen, bei den Closed-Source-Treibern entfällt dieses nervige Prozedere jedoch. Es reicht die Angabe von Modes im Formate $HOEHEx$BREITE_$HZ": Beispielauszug aus /etc/X11/xorg.conf
Section "Screen" [...] DefaultDepth 24 Option "NoLogo" "True" # Wollen wir immer das Logo sehen? Nicht wirklich... SubSection "Display" Depth 24 Modes "1368x768_60" # 1368x768 bei 60 Hz EndSubSection EndSection
Bitte beachten, dass der nvidia-Treiber nur Werte akzeptiert die durch 8 teilbar (wie 1360 oder 1368). 1366 wie mit den nvidia-Treibern unter Windows geht zur Zeit noch nicht, ist aber angeblich für zukünftige Treiberversionen in der Planung.
50 Hz Problematik
Mehr Information samt einer Gerädatenbank findet man unter [2] Achtung: nur wenn man sich sicher ist, dass das Display auch 50 Hz kann sollte man dies ausprobieren! Andernfalls können u.U Schäden am Gerät entstehen! Nur der CS-Treiber ist momentan in der Lage 50 Hz fähige Displays auch mit 50 Hz anzusteuern. Dazu muss in der xorg.conf etwas ändern und hinzufügen
Section "Monitor" [...] HorizSync 31.5 - 91.1 # exemplarisch, auf Herstellerangabe des Displays ändern! VertRefresh 50.0 - 75.0 # exemplarisch, auf Herstellerangabe des Displays ändern! Option "ExactModeTimingsDVI" "True" [...] EndSection Section "Screen" [...] Option "ModeValidation" "AllowNon60HzDFPModes, NoDFPNativeResolutionCheck" [...] EndSection
Wichtig für ruckelfreies Deinterlacing ist zusätzlich noch die Option
Section "Device" [...] Option "UseEvents" "True" [...] EndSection
Danach sollte man über Modes "1368x768_50" auch in der Lage sein das Display mit 50 Hz zu betreiben.
Schwarze Ränder trotz nativer X-Auflösung
Im Gegensatz zum nv-Treiber hat der nvidia-Treiber im Zusammenspiel mit Xine offenbar Schwierigkeiten bei der Berechnung des richtigen Seitenverhältnisses auf 16:9/16:10. Hier hilft die Angabe von --aspect=16:9 oder --aspect=16:10:
xinit -e vdr-sxfe --aspect=16:9 -f xvdr:tcp://localhost
Die zusätzliche Angabe der Auflösung in Form von --width=$BREITE --height=$HÖHE kann ebenfalls hilfreich sein.