Vorgeschichte
Kürzlich kam ich in den Genuss eines eigenen Samsung Smart TV. Angetrieben von Interesse in DLNA und Medienstreaming kam ich auf “ReadyMedia”, ehemals “minidlna”. ReadyMedia verfügt zum aktuellen Zeitpunkt über alle benötigten Funktionen, um simples Medienstreaming zu realisieren. Von Haus gibt es bislang keinen Support für Transkodierung.
Dieser Punkt ist für mich jedoch von Relevanz, da fast meine komplette Musiksammlung aus den verlustfreien Formaten FLAC und WAV besteht. Der Samsung Smart TV unterstützt soweit ich dies ausprobiert habe lediglich MP3 – kein FLAC, kein WAV, kein AAC.
Folgende Möglichkeiten habe ich als Lösung ins Auge gefasst:
- Pre-Transkodieren der kompletten Sammlung, bei Zuwachs späteres “inkrementelles Transkodieren”
- “On-the-fly”-Transkodieren
Beide Verfahren haben ihre Vor- und Nachteile. So verbraucht die Pre-Transkodierung zwar mehr Speicher, wenn ich die Originale behalten will, es entsteht aber weniger/kaum Rechenaufwand bei der Wiedergabe.
Dank “On-the-fly”-Transkodierung kann ich meine Musiksammlung unaufgeräumt und unvorbereitet einwerfen. Dafür entsteht bei jeder Wiedergabe ein gewisser Rechenaufwand, der letztlich zu einer kleinen, aber dennoch spürbaren Verzögerung führt.
Das zweite Verfahren habe ich gewählt, da ich dieses als weit komfortabler empfinde und Rechenzeit ein zu vernachlässigender Punkt ist – beim Streaming-Server handelt es sich um einen Dell Optiplex 755 mit Core2Quad Q6700.
Was wir nun tun
- Hinzufügen des Deb-Multimedia-Repositorys
- Herunterladen, kompilieren und installieren
- Abhängigkeiten
- ReadyMedia-transcoding
- Grundkonfiguration von ReadyMedia-transcoding
- Anpassen des “transcoding_audio”-Skripts
- Start und Funktionstest
- Abschluss
Hinzufügen des Deb-Multimedia-Repositorys
In Anbetracht dessen, dass Debian Jessie nun bereits ein Jahr auf dem Buckel hat und bereits bei Release viele Pakete, insbesondere Bibliotheken wie auch FFmpeg aufgrund der “Freeze-Policy” veraltet waren, ist es sinnvoll, das Deb-Multimedia-Repository zu nutzen.
Datei /etc/apt/sources.list oder /etc/apt/sources.list.d/99-deb-multimedia.list mit folgendem Inhalt befüllen:
deb ftp://ftp.uni-kl.de/debian-multimedia/ testing main deb-src ftp://ftp.uni-kl.de/debian-multimedia/ testing main
Pubkeys importieren, um Fehlermeldungen und Sicherheitsrisiken vorzubeugen:
apt-get install deb-multimedia-keyring
Paketlisten aktualisieren und ein Upgrade durchführen:
apt-get update && apt-get dist-upgrade
Herunterladen, kompilieren und installieren
Abhängigkeiten
Meinen Beobachtungen zufolge werden die mit dem folgenden Kommando zu installierenden Pakete in Debian Jessie benötigt:
apt-get install git automake autopoint gcc libavutil-dev libavcodec-dev libavformat-dev libjpeg-dev libsqlite3-dev libexif-dev libid3tag0-dev libogg-dev libvorbis-dev libflac-dev libmagickwand-dev build-essential gettext ffmpeg
ReadyMedia-Transcode
Um ReadyMedia-Transcode herunterzuladen, werden die Quelldateien zuvor aus dem Bitbucket-Repository geklont:
git clone -b transcode https://bitbucket.org/stativ/readymedia-transcode.git
Um schlussendlich zu kompilieren, werden diese 4 Befehle benutzt:
./autogen.sh ./configure make make install
Grundkonfiguration von ReadyMedia-Transcode
Eine beispielhafte Konfiguration liegt im Verzeichnis “readymedia-transcode” bei. In dieser habe ich die folgenden Zeilen abgeändert:
port=8201 user=minidlna media_dir=A,/mnt/three media_dir=V,/mnt/two friendly_name=Medienserver transcode_audio_transcoder=/root/readymedia-transcode/transcodescripts/transcode_audio
Diese Änderungen sind, bis auf die letzte, nicht notwendig, aber meiner Meinung nach empfehlenswert. In der letzten Zeile wird ein Skript definiert, welches sich dann um die Transkodierung kümmert. Auch hierfür werden bereits Skripte mitgeliefert, welche sich in meinem Fall allerdings als nicht funktionstüchtig herausgestellt haben.
Anpassen des “transcoding_audio”-Skripts
Standardmäßig kommt FFmpeg zum Einsatz, um beliebige Formate in das gewünschte, vom jeweiligen Smart TV unterstützte, Format zu transkodieren. Aber auch andere Software kann hierfür genutzt werden. Die Skripte sind in Bash geschrieben und die einzige Bedingung ist, dass die Ausgabe der transkodierten Daten per pipe möglich ist.
Mit dem mitgelieferten Skript hatte ich gleich mehrere Probleme. Dort wird ffmpeg mit folgenden Parametern gestartet:
ffmpeg -ss $STARTPOSITION -t $DURATION -i "$SOURCE" -loglevel quiet -acodec libmp3lame -f mp3 -ar 44100 -ab 224k pipe:1
Zum einen kommt hier eine veraltete Syntax zum Einsatz (z. B. -ab statt -b:a). Zum anderen hatte ich mit einer FLAC-Testdatei Probleme, da in den Stream Videodaten gemischt wurden. Mein ffmpeg-Befehl lautet daher nun so:
ffmpeg -ss $STARTPOSITION -t $DURATION -i "$SOURCE" -f mp3 -c:v copy -vn -b:a 128k pipe:1
Würde ich an meinem Smart TV AAC nutzen können, könnte das Kommando auch so aussehen:
ffmpeg -ss $STARTPOSITION -t $DURATION -i "$SOURCE" -f adts -c:v copy -vn -b:a 128k pipe:1
Start und Funktionstest
Ich persönlich starte den Daemon noch manuell und in screen (während ich mich im Verzeichnis mit Konfiguration und Binary befinde):
screen ./minidlnad -d -f readymedia-medienserver.conf
Hierbei definiere ich mit -d, dass ich für das Debugging relevante Informationen (am Anfang bei Transcoding-Problemen sehr hilfreich) angezeigt bekommen möchte. So wird beispielsweise auch der Output (z. B. Transcoding-Fortschritt) von ffmpeg angezeigt. Mit -f wird definiert, dass ich eine eigene Konfigurationsdatei namens “readymedia-medienserver.conf” nutzen möchte.
Abschluss
Zum Abschluss gilt es noch zu sagen, dass einige Funktionen, die man bei der Nutzung von offiziell unterstützen Formaten hat, nicht vorhanden sind. Am nervigsten ist davon, dass die “Fortschrittsanzeige” der Musiktitel fehlt. Weiterhin ist die “On-the-fly-Transkodierung” mit einer gewissen Latenz beim starten eines Titels verbunden.
Es gibt noch einige weitere Nachteile, die ich in Freizeit versuche zu beheben und dann entsprechend auch irgendwann in das Projekt einfließen zu lassen.
Hinweis: Dieser Beitrag erhebt keinen Anspruch auf Vollständigkeit. Über jedwede Informationen per Mail, Kontaktformular oder Kommentarfunktion bin ich sehr erfreut.
Quellen
- http://superuser.com/questions/554962/converting-mp3-to-aac-and-outputting-to-stdout
- http://www.winxdvd.com/resource/aac-vs-mp3.htm
- http://superuser.com/questions/441361/strip-metadata-from-all-formats-with-ffmpeg
- http://superuser.com/questions/268985/remove-audio-from-video-file-with-ffmpeg
- https://gist.github.com/williamrowell/f11f1a5d88586e8d838f
- https://bitbucket.org/stativ/readymedia-transcode/issues/11/unable-to-transcode-dts-to-pcm-ac3
- https://trac.ffmpeg.org/ticket/3085
- http://stackoverflow.com/questions/8760346/how-do-i-increase-the-scrollback-buffer-in-a-running-screen-session
- http://stackoverflow.com/questions/18160493/convert-yuv-to-mp4-by-ffmpeg-on-android
- https://bitbucket.org/stativ/readymedia-transcode/src
- https://bitbucket.org/stativ/readymedia-transcode
- http://forums.openmediavault.org/index.php/Thread/424-MiniDLNA-transcoding/