jmhobbs

Hard subs with mencoder, or, annotating screencasts for free.

I was working on a screen cast for a project and I could not get anything to work the way I wanted to. I didn't have the desire to purchase software, so I sought a way to annotate it for free. I tried a half dozen free and open source video editors, with no real luck. Either they choked on the format I captured (from CamStudio) or they didn't have a readily available inline text tool.

What I ended up using was plain old subtitles, plus the handyman's secret weapon, mplayer/mencoder.

Here's what I did. I fired up the video in VLC and found the points where I wanted to put my subtitle help text. Subtitle files are usually pretty straight forward. I chose the .srt format, which is plain text. You can edit by hand, or you can use a tool, I used the aptly named subtitleeditor. Which, by the way, barfed on my video file.

Here's a snippet of the resulting .srt file:

1
00:00:00,000 --> 00:00:13,000
Welcome to the product gallery walk through.

2
00:00:13,000 --> 00:00:23,000
Adding a product: Select image.

3
00:00:23,000 --> 00:00:32,000
Insert title and description.

Next I needed to turn those "soft" subs into "hard" ones. This is where mplayer/mencoder come in. To add soft subs to a video in mplayer, you use the -sub option. Running this in mplayer first is a good way to see how it will look at tweak it according to the many options you have. I went with the defaults, it looks pretty good that way.

Lastly, I needed a good mencoder recipe to pull it all together. After lots of searching I found a great MPEG4 one here.

It's a two pass system, and the crucial piece is in calculating the bitrate:

bitrate = 50 * 25 * width_of_video * height_of_video / 256

My bitrate was 2540600. After you get that, you just plug it into the two passes below. This includes my subtitle options.

mencoder -o /dev/null -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1:vbitrate=2540600:mbd=2:keyint=132:vqblur=1.0:cmp=2:subcmp=2:dia=2:mv0:last_pred=3 -nosound -sub MySubTitles.srt -subfont-text-scale 3 RawScreenCast.avi
mencoder -o FinishedScreenCast.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=2:vbitrate=2540600:mbd=2:keyint=132:vqblur=1.0:cmp=2:subcmp=2:dia=2:mv0:last_pred=3 -nosound -sub MySubTitles.srt -subfont-text-scale 3 RawScreenCast.avi

It takes a while but not too long. When all was said and done I had a perfect hard-subbed version and it shrank my file size from ~550MB to 7.6MB. That is a great encoding recipe.

Average video still.
An average frame, with hard subs.