Updated 2014-04-03 02:43:32 by RLE

I (VI) wanted to batch convert many avi's of my daughter into vcd's. Grandparents don't settle for less :). The process takes a long time. At home, I'm stuck with windows. I've found that the freeware encoder at [1] works well. But there are a few things I'd like. A batch convert mode or at least a complex enough command line to do encoding and exit. Also on my home PC, avi2vcd crashes if I encode twice in a row. I have to exit the program after each convert.

Here's a script using cwind to automate this. cwind is a wonderful package, and I've used it in all kinds of situations. This is using version 1.4.
 package require cwind
 
 # Procedure to convert one avi file to a pal format in a subdir
 # called pal.   Fix path to avi2vcd below.
 
 proc do_conv {fn} {
     if ![file exists $fn] {
         puts "Error Can't find file $fn"
     }
     set  target [file join pal [file root $fn].mpg]
 
     # Do not reconvert if we already have a newer mpg
 
     if {[file exists $target] &&
         ([file mtime $target] > [file mtime $fn])} {
         puts "Target \"$target\" is newer than source \"$fn\", not converting"
         return 1
     }
 
     set start [clock seconds]
     puts "Will convert $fn into $target at [clock format $start]"
 
     file mkdir pal
     file delete $target
 
     # Fix this path to point to your own executable
     exec start c:/tools/avi2vcd/avi2vcd.exe &
     ::cwind::waitwind "avi2vcd*" 20
 
     # Raise it.
     ::cwind::show "avi2vcd*"
 
     # Move to Source File
     ::cwind::send |TAB| |TAB|
     ::cwind::send [file nativename [file normalize $fn]]
     # Move to Target File
     ::cwind::send |TAB|
     ::cwind::send [file nativename [file normalize $target]]
 
     # Move to Format.  First go all the way up and down to
     # whatever you want.  One down gets you to PAL
     ::cwind::send |TAB| |TAB| |TAB|
     ::cwind::send |UP| |UP| |UP| |DOWN|
 
     # Start the convert
     ::cwind::send |TAB| |TAB| |TAB| |TAB| |TAB| |RET|
     set t [::cwind::gettext]
 
     # avi2vcd puts out a dialog box to say it's ended
     # remove the puts if you don't want to see the messages
     # we check every 5 seconds to see if a dialog box (no title)
     # has been displayed
 
     while {$t != ""} {
         after 5000
         set t [::cwind::gettext]
         puts $t
     }
     set end [clock seconds]
     puts "Done in [expr $end - $start] seconds"
 
     # Remove the dialog box
     ::cwind::send |RET|
     after 5000
     
     # Raise window, in case it's gone away
     ::cwind::show "avi2vcd*"
     after 1000
 
     # Move to the exit button and exit
     ::cwind::send |TAB| |RET|
 
     # Probably could be shorter, but program has to exit
     # otherwise the delete below doesn't work.
     after 5000 
 
     # Delete the log file that avi2vcd creates
     file delete [file root $target].log
 
     #Probably not needed again but prevent multiple invocations
     #in parallel. (or maybe could be shorter)
     after 5000
 }
 
 # Procedure to run the encoder on all the avis in the current
 # directory
 
 proc do_all_avis {} {
     foreach avi [glob *.avi] {
         do_conv $avi
     }
 }
 
 do_all_avis