Monday Dec 29, 2008

A Python script to encode iMovie .dv files to MP4 using HandBrake



I recently captured some old 8mm video tape of the family to iMovie.  My strategy for archiving is to copy the material to a new medium every few years. We will see how that works out.


In any event, I want to throw all the videos on a hard drive and store it offsite in our safety deposit box. However, the raw .DV footage is too large and won't fit (and I am too cheap to buy more hard drives or a larger safety deposit box). 

Necessity being the mother of invention, I needed a script to encode and compress all my .DV footage. MP4 seems to be a good choice for a format that is widely supported and offers good compression quality.  I wanted to preserve the folder event structure in iMovie - so a simple find command was not going to cut it.

I started off with bash - but quickly became frustrated with the quirky syntax. One of the problems with shell scripts is that file and path names are strings - not objects. You often run into escaping issues when presented with long file names and special characters.  You can work around these issues - but it is much more painful than it ought to be.

I elected to give python a go and see if it was any easier. This is my first python script - and I don't claim this is a particullarily good example. However - if you are facing the same issue - please feel free to use this as a starting point.

You will need a copy of the Handbrake CLI  to perform the mp4 encoding. Handbrake uses the x264 encoder.


Without further ado, here is the script:


/Users/warrenstrange/src/videorip/src/videorip.py
 1 #!/usr/bin/env python

 2 # Script to encode DV files to MP4 using HandBrakeCLI
 3 # Preserves the folder structure of the iMove events
 4 __author__="warrenstrange"
 5 __date__ ="$Dec 28, 2008 6:28:09 PM$"

 6 
 7 import os
 8 import subprocess
 9 import os.path

10 
11 # Source for .dv files
12 root = "/Volumes/Velocity1/iMovie Events.localized"
13 # Destination for encoded MP4 files
14 dest = "/Volumes/WSTCD/mp4.bak"

15 #dest = "/var/tmp/xx"
16 
17 def encode(path, dest):
18     for root, dirs, files in os.walk(path, topdown=False):

19         for name in files:
20             # Get the extension
21             (base, ext)=os.path.splitext(name)
22             # If it is a .dv file

23             if ext.lower() == ".dv":
24                 # Get the directory folder where the .dv file is stored
25                 (h,tail) = os.path.split(root)
26                 # Form the destination directory folder name

27                 destdir = os.path.join(dest,tail)
28                 # Create the destination directory if required
29                 if not os.path.exists(destdir):
30                     os.mkdir(destdir)

31                 # Form the output file name (.MP4 extenstion)
32                 newfile = os.path.join(destdir, base + ".MP4")
33                 infile = os.path.join(root,name)
34                 # If it already exists don't overwrite it - skip it

35                 if os.path.exists(newfile):
36                     print "skipping " + infile
37                 else:
38                     subprocess.call( ["HandBrakeCLI", "--preset=Universal", "-i" ,infile, "-o", newfile])

39               
40     
41 if __name__ == "__main__":
42     encode(root, dest)
43     
44 

About

Things that amuse me

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today
News

No bookmarks in folder

Blogroll