Thursday, September 27, 2012

Encoding content for Roku 2 and MyMeida

There are many sources on the Internet that explain how to encode content for Roku 2. Unfortunately most of the sources are obsolete and use outdated versions of tools. I will try to share my experiences in this post.

The simplest way to encode content for Roku is to use Handbrake. The current version 0.9.8 includes Normal preset which works well with Roku. The High preset also works but sometimes produces out of sync video and audio. It also takes significantly longer time to encode with the High preset. Selecting MP4 container and leaving all other options in their default state works well and gives reasonably fast encode with good quality video. Please note that Normal preset does not support multichannel audio by default.
Encoding with ffmpeg is a little bit more involved but gives a great deal of control over encoding time as well as encoding quality. This is example command line that works with ffmpeg version 20120924-git-bbe9fe4:
ffmpeg.exe -i "video.avi" -acodec libvo_aacenc -ab 128k -ac 2 -vcodec libx264 -preset veryfast -profile main -crf 18 -threads 0  -y "video.mp4"
This will produce video compatible with Roku but the bit rate would be on the higher side. To decrease bit rate different preset can be used. Following presets are available - ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo. Start with medium (default) and go faster until the balance between encoding speed and bit rate is satisfactory. You can also use high profile but it will slowdown your encoding. When using high profile specify -level 4 option because Roku does not support anything above level 4:
ffmpeg.exe -i "video.avi" -acodec libvo_aacenc -ab 128k -ac 2 -vcodec libx264 -preset veryfast -profile high -level 4 -crf 18 -threads 0  -y "video.mp4"
Faster presets generate larger files and slower presets generate smaller files. Try it out to see which one works well with your computer and gives you smallest file in an acceptable time. The veryslow and placebo presets together with high profile do not work with Roku and cause macroblocks and frozen picture during decode

To my surprise Roku can also decode MPEG-4 Part 2 (Xvid). Any avi file that is encoded with this codec can be quickly converted in to MP4 file without re-encoding the video. Audio most likely has to be re-encoded but this takes much less time than video encoding. Roku only supports AAC audio and Xvid files usually contains MP3 or AC3 audio. To convert compatible Xvid file use this command:
ffmpeg.exe -i "video.avi" -acodec libvo_aacenc -ab 128k -ac 2 -vcodec copy -threads 0 -t 120 -y "video.mp4"
To test if your file would work without completely converting it use -t 120 command line switch. This would convert first 120 seconds of video and allow you to test it out with your Roku. Remove this switch from command line after you satisfied that the resulting video works. Xvid was and still is a very popular codec and people accumulated a lot of content encoded with this codec. DivX codec should also be compliant with MPEG-4 Part 2 but I have not tried converting this type of files as I have none.

I found that Roku MKV support is very poor when streaming over the network. The device often crashes when starting video playback or trying to seek within the content. When played from the USB stick there are no such problems. To avoid any issues it is best to convert mkv files in to mp4 which can be done without re-encoding video and audio in most cases. You need to make sure that your mkv file contains h264 video and AAC audio. You can do this by using ffprobe which is a part of ffmpeg package. You can convert container with ffmpeg or mp4box tool. Following command line works with ffmpeg:
ffmpeg.exe -i "video.mkv" -codec copy "video.mp4"

Stay tuned for more Roku information.


mb said...

My initial interest in using Roku + MyMedia waned. The trouble of converting videos to MP4, even automaticing it, was more trouble than it was worth. I still use Roku. If I need to play a non-MP4 video, I use a different device. Ugly, but it works.

xwin said...

I am not sure what method you use but for me encoding is not a trouble at all. We have 2 Roku boxes and with MyMedia one can stop watching in one room and resume in another which is very convenient. Also putting all kids content on the server allows you to avoid scratched DVDs and kids can select what they want to watch. I used other devices but at the end standardized on Roku.

randall elkins said...

looking through ffmpeg options i dont see one for the -ab 128k switch. can you explain its purpose

xwin said...

This option allows you to set audio bit rate. -ab 128k tells ffmpeg to encode at 128kbis/s.