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.
An average frame, with hard subs.