VDR mit DVI/VGA

Aus VDR Wiki
Wechseln zu: Navigation, Suche

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.