In Zenslack 1.0 und 2.0 sowie in Zendeb auf der Samsung SMT-7020s hatte ich
mich immer ein wenig über gelegentliche Aussetzer (Pausen von ca. 0,1s) im
Ton geärgert.
Mit vdr gemachte Aufnahmen hatten, mit der SMT abgespielt, immer an den
ungefähr gleichen Stellen Audio-Unterbrechungen. Kopierte man die Aufnahmen
jedoch auf einen normalen PC und spielte sie mit VLC ab, waren keine
Aussetzer zu hören, d.h. der Fehler lag nicht nicht bei der Aufnahme,
sondern bei der Wiedergabe.
Zenslack und Zendeb nutzen xineliboutput (Mit top ist der Prozess
als "vdr-sxfe" sichtbar), einen Softwaredecoder, um den DVB-MPEG2-Stream auf
dem TV-Gerät dazustellen. Das bedeutet, dass der 733MHz-Celeron der SMT die
Arbeit der MPEG2-Decodierung bewältigen muss.
Besonders viele Audio-Aussetzer gibt es bei der Serie "CSI Miami" auf RTL. In
dieser Sendung ist die Schnittfolge sehr hoch, und ca 1s nach jedem
Szenenwechsel folgt ein Aussetzer im Ton. Dieses Symptom sprach für
einen "Flaschenhals" in der Übertragungsbandbreite, da MPEG2 am Anfang jeder
Szene das Vollbild überträgt (viele Daten), danach aber nur noch die
Änderungen (wenige Daten), und die Übertragung der vielen Daten des Vollbilds
anscheinend die Bandbreite des Tonkanals zu sehr verringerte..
Nach Experimenten mit verschiedenen I/O-Schedulern, nice-Werten
und Echtzeit-Kernels konnte eine Überlastung der CPU schliesslich
ausgeschlossen werden. Ohnehin lag die gesamte CPU-Auslastung während der
Wiedergabe über vdr-sxfe deutlich unter 50%.
Der Flaschenhals musste also woanders liegen.
Schliesslich habe ich eine Lösung gefunden:
In Zenslack und Zendeb erhält vdr-sxfe die Audio- und Videodaten über die
local loop, Port 37890, per UDP-Protokoll. Die Anweisung, UDP zu verwenden,
wird dem vdr-sxfe-Binary beim Aufruf explizit als Kommandozeilenparameter
übergeben.
Offenbar liegt das Problem bei der Verwendung von UDP.
Vielleicht liesse sich die UDP-Übertragung irgendwie verbessern (ich bin kein
Netzwerk-Experte), aber folgender Wikipedia-Eintrag stimmt mich da eher
nachdenklich
(http://de.wikipedia.org/wiki/U…am_Protocol#Eigenschaften
"UDP stellt einen verbindungslosen, nicht-zuverlässigen Übertragungsdienst
bereit. Das bedeutet, es gibt keine Garantie, dass ein einmal gesendetes
Paket auch ankommt, dass Pakete in der gleichen Reihenfolge ankommen, in der
sie gesendet wurden, oder dass ein Paket nur einmal beim Empfänger eintrifft.
Eine Anwendung, die UDP nutzt, muss daher gegenüber verlorengegangenen und
unsortierten Paketen unempfindlich sein oder selbst entsprechende
Korrekturmaßnahmen beinhalten."
Vermutlich verarbeitet das System grosse UDP-Pakete nicht richtig.
Folgender Workaround funktioniert jedoch sehr gut: Ändert man den Aufruf von
vdr-sxfe so, dass statt UDP TCP verwendet wird, so steigt zwar die CPU-Last
auf dem PIII-Celeron um ca. 5% an, dafür gibt es aber auch keine
Audio-Aussetzer mehr.
Wer diesen Workaround vornehmen möchte, sollte folgendermaßen vorgehen:
-----------------------------------------------------
Zenslack (V1.0-rc35, vermutlich auch die anderen Zenslack-Versionen):
Datei /etc/zenslack/runmms.sh editieren - in der Zeile
/bin/sleep 2 & vdr-sxfe --video xv
xvdr://${ZS_VDR_SERV_IP} --aspect=$VDRTVMODE --nokbd --udp --lirc -
-fullscreen --post
tvtime:method=Linear,cheap_mode=1,pulldown=0,use_progressive_frame_flag=1
&> /tmp/sxfe.log
muss "--udp" ersetzt werden durch "--tcp". Nach einem Reboot der SMT ist die
Einstellung aktiv (Restart des VDR reicht dazu nicht aus).
-------------------------------------------------------
Zendeb (0.4.1-Beta, vermutlich auch die Vorgängerversionen):
Datei /etc/zendeb/vdr-sxfe.sh editieren - in der Zeile
vdr-sxfe --video xv
xvdr://127.0.0.1:37890 --aspect=$ASPECTRATIO --nokbd --lirc --tcp --fullscreen
$XINELIBPOST &> /tmp/sxfe.log
muss "--udp" ersetzt werden durch "--tcp".
--------------------------------------------------------------
Möglicherweise können andere VDR-Distributionen ebenfalls von dem Workaround
profitieren. Wer mit Audio-Aussetzern bei vdr-sxfe zu tun hat und es
probieren möchte, kann sich mit
cd /etc
grep -R "vdr-sxfe" *
alle Dateien in /etc, die einen potentiellen Aufruf von vdr-sxfe enthalten,
ausgeben lassen und dort ggf. die Option "--udp" ändern auf "--tcp". Die
UDP-Option des Aufrufs kann auch im xvdr-Argument enthalten sein, z.B.
xvdr:udp://127.0.0.1 - auch in diesem Fall kann das "udp" einfach durch
ein "tcp" ersetzt werden.