This document describes how to test the transcoding feature with the current MediaTomb SVN code. NOTE: a more in depth documentation on transcoding is now available here: http://www.deadlock.dhs.org/jin/mt/transcoding.txt 1. check out the latest development code from SVN: svn co https://svn.mediatomb.cc/svnroot/mediatomb/trunk/mediatomb mediatomb 2. make sure you have automake (at least 1.9) and autoconf (at least 2.59) installed and run the following command in order to generate the configure script: autoreconf -i 3. make sure you have all requried dependencies, take a look at the section 2 of the documentation to find out what you need: http://mediatomb.cc/pages/documentation if you want to be minimalistic just install sqlite3-devel and file-devel 4. in case you already have an existing MediaTomb installation, it is a good idea to keep this testing install separate, I suggest you pick a directory in your home, in below example we will assume that you will do your test install in /home/user/test so, run the configure script: ./configure --prefix=/home/user/test --enable-external-transcoding 5. build MediaTomb and install it - it will be put in the /home/user/test directory: make && make install 6. create a separate configuration (i.e., in order not to mess up your default installation); the easiest way to do it is to run MediaTomb, specifying an alternative configuration directory: /home/user/test/bin/mediatomb -m /tmp -f testinstall 7. press CTRL-C to terminate the server, verify that a fresh config.xml and a new database have been created in the /tmp/testinstall directory. 8. now comes the tricky part; as you probably read from the news, the current transcodin that accepts an input file and is capable of outputting the transcoded stream to a FIFO. that also means, that you can test your transcoder independently of MediaTomb, before adding it to the configuration. some transcoders, like ffmpeg will require wrapper scripts, because they seem to have problems writing to a FIFO. so, before we add our profiles to MediaTomb, we will do some testing in the terminal. of course I could simply tell you what already works and give you a predefined setup, however I want you to understand the idea behind the external transcoding feature. first example: let's assume that you want to transcode flac files to PCM, this can be achieved with the help of the ogg123 application. create a FIFO for testing: mkfifo /tmp/mytest run ogg123, specifying the input file and telling it to output the data to your test FIFO: ogg123 -d wav -f /tmp/mytest /home/mymusic/somefile.flac you should see that ogg123 starts up and then keeps waiting. in a different terminal, try playing from the FIFO: mplayer /tmp/mytest you should see that ogg123 starts decoding, and mplayer should play the transcoded PCM stream. this mens that ogg123 can handle the output to a FIFO and thus will also work when called by MediaTomb. second example: ffmpeg has problems with outputting data to a FIFO, so we need a wrapper script, use your favorite text editor to create the following script: #!/bin/sh exec ffmpeg -i "$1" -b 2000k -me zero -f mpeg -ar 48000 -ac 2 - >"$2" this example transcodes to MPEG, of course you can use any ffmpeg transcoding options you like. note however, that when transcoding to a video format you have to choose one that can be streamed (like MPEG), .AVI will not work! note, that the script starts ffmpeg using the exec call - this is very important, it will ensure that ffmpeg will run with the same process ID as the ffmpeg-tr.sh script; this is required so MediaTomb can kill the process when playback has been stopped. put your script in $PATH (i.e. in a location that is in your $PATH), make sure that it is executable (i.e. chmod u+x ffmpeg-tr.sh) perform the same test as in the first example: ./ffmpeg-tr.sh /home/user/videos/myvideo.avi /tmp/mytest try playing from the fifo in a second terminal: mplayer /tmp/mytest if all works well you can go ahead and add the ffmpeg profile to your config.xml using vlc is another possibility, actually we had a much better experience with it. also, while ffmpeg has problems streaming URLs directly (i.e. accessing online content), vlc seems to handle that pretty well. the following script worked nicely for transcoding YouTube videos: #!/bin/sh INPUT="$1" OUTPUT="$2" exec vlc -I dummy "${INPUT}" --sout \ "#transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,scale=,aenc=ffmpeg,\ acodec=mpga,ab=192,samplerate=44100,channels=2}:standard{access=file,\ mux=ps,dst=${OUTPUT}}" vlc:quit \ >/dev/null 2>&1 9. the transcoding layout in config.xml goes under the tag, for example you can put it right after the tag. video/mpeg yes yes video/mpeg no yes yes audio/x-wav no audio/x-wav yes yes audio/x-wav yes yes first mimetype to profile mappings are defined - that means, you set which transcoding profile will handle a particular mimetype. then you define the profiles, each profile defines the mimetype of the transcoded stream (or the target mimetype) and specifies how the transcoding is done (look at the agent tag). %in and %out are special tokens, they will be replaced by the input file name, fifo name or URL and the output FIFO name when the transcoder is launched. note the buffer setting - you can define the size of the buffer, the size of the chunks (i.e. how much data will be read from the buffer at once) and the initial fill size of the buffer (at the start of transcoding the first data will be sent to the renderer after the buffer is filled up to that value) there is a special option, if the profile is supposed to handle ogg theora but not ogg vorbis files: simply add a empty tag under . the values used above are just example settings, you might have to finetune them to match the performance of your system. a fast system can usually use lower fill-size values, thus having a better response time when starting playback. on a slower system it might be better to prefill the buffer to some higher amount to prevent dropouts. 10. remember, that we created a new configuration in /tmp/testinstall, so, edit your and define transcoding. make sure that the transcoders are in $PATH 11. start mediatomb, pointing it to your new configuration: /home/user/test/bin/mediatomb -c /tmp/testinstall/config.xml 12. go to your renderer and try to play media that is usually unsupported, watch the mediatomb console, you should see how it starts the transcoder when you press PLAY on your renderer; if your transcoder fails you should also see that there, in this case you will have to do some debugging as described in 8., also check that you specified all command line arguments correctly in the agent tag of your configuration. KNOWN ISSUES: obviously, seeking and thus FF/REW will not be possible. pausing may work, but this depends on how your player implements it; if it simply stops reading the data but keeps the connection open - pause will work; if it shuts down the connection when you press pause - resuming from where you paused will not work. The PlayStation 3 is very eager to enforce the use of various DLNA tags and will refuse even trying to play the media if it does not like something in the browse result XML. Currently we have success reports playing transcoded video streams (to MPEG) on the PS3, but we also have failures to play PCM streams. This is related to the PS3 firmware and has to be investigated. We also have success reports of playing transcoded FLAC streams on the D-Link DSM-510. Good luck! And let me know if it works/fails. Jin for support write to: jin at mediatomb dot cc or drop by in #mediatomb on FreeNode IRC.