DVB unter FreeBSD

Betrifft OS:
FreeBSD

Dieser Artikel zeigt kurz und beispielhaft, wie man USB-Geräte für den Empfang von digitalem Rundfunk unter FreeBSD nutzt. Eingegangen wird auf die in Deutschland verbreiteten Verfahren DVB-S2 (Satellit), DVB-C (Kabel) und DVB-T (terrestrischer Rundfunk).

Derzeit deckt dieser Artikel nicht alle möglichen Programme zum Rundfunkempfang ab, es wird daher um Erweiterung gebeten.

Voraussetzungen

Voraussetzung ist erst einmal ein von webcamd unterstützter USB-Stick zum Empfang des jeweiligen digitalen Rundfunksystems. Des weiteren wird ein Computer benötigt, der die gewünschte Bildqualität dekodieren kann. Bei DVB-S2 und DVB-C ist eine Ausstrahlung von bis zu 1080p Full-HD möglich, dies benötigt einen schnellen Prozessor oder aber eine Grafikkarte mit VDPAU-Unterstützung. DVB-T ist derzeit auf 720p begrenzt, hier sollte eine Dualcore-CPU der Mittelklasse ausreichen.

Auf der Softwareseite wird FreeBSD 8.1 oder höher verlangt, getestet sind derzeit nur FreeBSD/i386 und FreeBSD/amd64. Des Weiteren muss der Portstree in /usr/ports aktuell sein. Dieser Artikel geht davon aus, dass ein funktionsfähiges X.org installiert ist.

Installation

cuse4bsd

multimedia/cuse4bsd ist ein Kernelmodul, welches es im Userland laufenden Programmen erlaubt Devicenodes in /dev anzulegen. Diese Funktion wird später von webcamd genutzt. Die Installation erfolgt einfach über die Ports:

 # cd /usr/ports/multimedia/cuse4bsd-kmod/ 
 # make install clean

Anschließend wird das Modul geladen:

 # kldload cuse4bsd

Es fehlt noch ein Eintrag in /boot/loader.conf zum automatischen Laden beim Start des Betriebssystems:

 # echo 'cuse4bsd_load="YES"' >> /boot/loader.conf

webcamd

multimedia/webcamd ist Daemon - also ein im Hintergrund laufender Dienst - welcher es ermöglicht für „Video4Linux“ geschriebene Treiber im Userland auszuführen. Dieser Dienst ist der Kern eines DVB-Setups unter FreeBSD. Die Installation geschieht auch hier über die Ports:

 # cd /usr/ports/multimedia/webcamd
 # make install clean

Anschließend wird ein Eintrag in der /etc/rc.conf zum automatischen Start von webcamd vorgenommen:

 # echo 'webcamd_enable="YES" >> /etc/rc.conf

Abschließend wird der Dienst devd zum Verarbeiten von Systemereignissen neu gestartet:

 # service devd restart

devfs

Normalerweise werden die Geräte in /dev mit den Rechten 600 angelegt. Dies bedeutet, dass nur root auf sie zugreifen kann. Für DVB ist dies unpraktisch bis problematisch, da das zugehörige Programm in der Regel mit Rechten als unprivilegierter Nutzer läuft. Eine Möglichkeit sind Einträge in den aktuellen Regelsatz unter /etc/devfs.rules zum automatischen Setzen erweiterter Berechtigungen:

add path dvb/adapter*/demux* mode 0660
add path dvb/adapter*/frontend* mode 0660
add path dvb/adapter*/dvr* mode 0660

Anpassung des Benutzers

Der Benutzer, der das DVB-Signal nutzen möchte, muss Mitglied der Gruppe 'webcamd' sein. Daher wird er in diese eingetragen. Anschließend sollte er sich aus- und wieder einloggen um sicherzustellen, dass die Änderung übernommen wurde:

pw groupmod -m username

Funktionstest

Wird der USB-Stick nun eingesteckt, sollten in /dev/dvb ein Unterverzeichnis adapter0 mit drei Device-Nodes erscheinen. Ist dies nicht der Fall, kann es drei Gründe haben.

  1. Der Stick ist derzeit nicht unterstützt. Hier sei auf das BSDForen.de-Forum und die freebsd-multimedia@ Liste verwiesen.
  2. Der Stick benötigt eine Firmware. Aus Lizenzgründen liefert webcamd die Firmware nicht mit, nennt aber in seiner Ausgabe (sie ist in /var/log/messages zu finden) ihren Namen. Diese Datei kann mit einer Suchmaschine gefunden, heruntergeladen und nach /boot/modules kopiert werden. Alternativ kann man das Perl-Script get_dvb_firmware runterladen und verwenden. Anschließend den Stick erneut einstecken.
  3. Der Stick identifiziert sich nicht als DVB-Gerät. Gerade billigere Modelle haben oftmals falsch gefüllte Register zur Erkennung der Geräteklasse. Hier hilft nur webcamd als root manuell zu starten:
     # webcamd 

Sendersuchlauf

Ist der Stick erkannt worden, ist der nächste Schritt die Durchführung eines Sendersuchlaufes. Hierbei ist zu beachten, dass bei DVB-T Sticks die beigelegten Antennen zumeist von eher niedriger Qualität sind. Für beste Ergebnisse sollte sie während des Suchlaufs direkt vor der Scheibe eines Fensters platziert, oder aber eine aktiv verstärkte Antenne genutzt werden.

Es gibt mehrere Scanprogramme. An dieser Stelle wird das Tool w_scan genutzt. In den Ports kann es unter multimedia/w_scan gefunden werden und besitzt keinerlei weitere Abhängigkeiten. Es kann Senderlisten in verschiedenen Formaten generieren, zudem unterstützt es alle derzeit im Einsatz befindlichen DVB-Formate.

Die erzeugte Ausgabe ist die channels.conf, eine Liste aller Sender mit ihren Parametern. Diese kann in verschiedener Form erzeugt werden, wobei die Form mittels einer Option für w_scan festgelegt wird. Die folgende Tabelle schlüsselt auf, welcher Parameter für welches Prorgramm genutzt werden muss. Hierbei ist beachten, dass Kaffein eine integrierte Scanfunktion besitzt.

Option Programme
Keine Option VDR, MythTV
-k kaffein
-G Gstreamer dvbsrc plugin
-M mplayer
-X mencoder, xine / libxine, zap

Des Weiteren müssen, je nach verwendetem DVB-System, eventuell noch weitere Parameter angegeben werden. Dies ist zum Beispiel der zu nutzende Satellit bei DVB-S2. Der Aufruf mittels

 # w_scan -h

bietet eine Liste aller Optionen. Grundsätzlich sollten Optionen nur dann angegeben werden, wenn sie auch benötigt werden! Unnütze Optionen können zu Problemen führen.

Ein Aufruf per

 # w_scan [optionen] >> channels.conf

führt den Suchlauf durch. Je nach DVB-System, Anzahl der Sender und dem Wohnort kann dieser zwischen 10 und etwa 60 Minuten dauern. Anschließend wurde eine channels.conf generiert. Es empfiehlt sich nun mit einem Editor die Sendernamen manuell anzupassen, da die automatisch generierten Namen recht umständlich sind.

Abspielprogramme

mplayer / mencoder

multimedia/mplayer ist auch als das „Schweizer Taschenmesser in Sachen Video“ bekannt und kann als solches natürlich auch DVB abspielen. Dabei sind zuerst zwei Voraussetzungen zu erfüllen:

  1. mplayer und mencoder müssen mit Unterstützung für „v4l“ gebaut sein.
  2. Es muss eine kompatible channels.conf in ~/.mplayer liegen.

mplayer kann dann einfach per

 # mplayer dvb://sendername

aufgerufen werden. Da viele aber nicht alle DVB-Sendungen interlaced sind, empfiehlt sich die Nutzung eines Deinterlace-Filters. Nutzer von vdpau drücken hierfür während der Wiedergabe „D“, alle anderen können z.B. per

 -vd yadif

einen Softwarefilter einfügen und diesen per „D“ wahlweise aktivieren oder deaktivieren. Da DVB-Streams eine gewisse Neigung zu Rucklern haben ist es zudem ratsam einen Cache zu nutzen:

 -cache 2048

Während der laufenden Sendung können die Kanäle durch die Tasten „h“ und „k“ durchgeschaltet werden. Allerdings dauert der Kanalwechsel recht lange. Eventuelle, alternative Tonspuren werden per „#“ ausgewählt.

Es können auch Sendungen aufgenommen werden. Hierbei gibt es zwei Möglichkeiten. Die erste ist ein „dummer“ Dump des Streams durch mplayer. Der große Vorteil dieser Methode ist, dass praktisch keine CPU-Last generiert wird. Auch sehr langsame Maschinen, die zur Wiedergabe zu langsam sind, können damit aufnehmen. Nachteilig ist der vergleichsweise große Platzbedarf von etwa 10 Megabyte pro Minute bei einer Sendung in 720p. Folgendes Kommando nimmt zum Beispiel die ARD für zwei Stunden auf und schreibt die Ausgabe nach ./film.ts.

 # mplayer -dumpfile film.ts -dumpstream -endpos 2:00:00 dvb://ard

Alternativ ist eine direkte Umwandlung in ein anderes Dateiformat mit multimedia/mencoder möglich. Diese Methode erzeugt kleine Dateien, ist aber recht aufwendig. Ein 720p Stream per x264 codiert lastet einen Phenom II 940 mit 4x 3GHz z.B. zu ~60% aus. Folgendes Kommando nimmt die ARD für 2 Stunden auf und speichert die Aufnahme als H.264-Stream nach ./film.avi.

 #  mencoder -cache 2048 -oac mp3lame -ovc x264 -lameopts cbr:br=192 \
    x264encopts bitrate=700:preset=slow:threads=4 -vf yadif -endpos \
    02:00:00 -really-quiet -o film.avi dvb://ard