/[escript]/trunk/tools/vizTools/make_movie.py
ViewVC logotype

Annotation of /trunk/tools/vizTools/make_movie.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 371 - (hide annotations)
Fri Dec 16 00:57:13 2005 UTC (14 years, 11 months ago) by cochrane
File MIME type: text/x-python
File size: 4390 byte(s)
Added ability to specify the compression pattern at the command line.

1 jgs 123 #!/usr/bin/env python
2    
3 jgs 147 # $Id$
4    
5 jgs 123 """
6 jgs 149 Make an mpeg movie from the pnm files in the specified directory
7 jgs 123 """
8    
9     import os, sys, re
10     import getopt
11    
12     (opts, args) = getopt.getopt(sys.argv[1:],
13 cochrane 371 "s:d:o:f:p:t:h",
14     ["framestem=", "dirname=", "output=", "format=", "pad=", "pattern=",
15     "help"],
16 jgs 123 )
17    
18     def usage():
19     print "Usage:"
20 jgs 147 print " make_movie -s <framestem> -o <output filename> -f <format> -p <pad>\n"
21 jgs 123 print " Arguments:"
22     print " -s/--framestem: The frame filename stem (the stuff before .pnm) (required)"
23 jgs 149 print " -d/--dirname: The directory of frames (optional)"
24 jgs 123 print " -o/--output: Output mpeg filename (optional)"
25     print " -f/--format: Input frame image format (optional)"
26 jgs 147 print " -p/--pad: How many frames to pad the movie (optional)"
27 cochrane 371 print " -h/--help: Display this information (optional)"
28 jgs 123
29 jgs 149 dirname = "./"
30 jgs 123 mpegName = None
31     fnameStem = None
32     format = "pnm" # if format not specified assume pnm
33 jgs 147 pad = 1
34 cochrane 371 pattern = "IBBPBBPBB"
35 jgs 123
36     for option, arg in opts:
37     if option in ('-s', '--stem'):
38     fnameStem = arg
39 jgs 149 elif option in ('-d', '--dirname'):
40     dirname = arg
41 jgs 123 elif option in ('-o', '--output'):
42     mpegName = arg
43     elif option in ('-f', '--format'):
44     format = arg
45 jgs 147 elif option in ('-p', '--pad'):
46     pad = int(arg)
47 cochrane 371 elif option in ('-t', '--pattern'):
48     pattern = arg
49 jgs 123 elif option in ('-h', '--help'):
50     usage()
51     sys.exit(0)
52    
53     if fnameStem is None:
54     print "You must supply the stem of the frame filenames\n"
55     usage()
56     sys.exit(0)
57     if mpegName is None:
58     mpegName = fnameStem + ".mpg"
59    
60     # determine the number of files to convert
61 jgs 149 dirList = os.listdir(dirname)
62 jgs 123 r = re.compile( "%s\\d+\\.%s"%(fnameStem,format) )
63     count = 0 # counter for the number of files found
64     fnames = []
65     for fname in dirList:
66     if r.match(fname):
67     fnames.append(fname)
68     count += 1
69    
70 jgs 147 if count == 0:
71     raise ValueError, "No matching files found"
72    
73 jgs 123 # do a conversion if necessary
74     if format != "pnm":
75     print "Converting frames to pnm"
76     r = re.compile("%s\\d+\\." % (fnameStem))
77     for fname in fnames:
78     # strip off the bit after the last dot
79     front = r.findall(fname)
80     front = front[0]
81     # make the conversion string to pass to 'convert'
82 jgs 150 convString = "convert %s/%s%s %s/%spnm" % \
83     (dirname, front, format, dirname, front)
84 jgs 123 retVal = os.system(convString)
85     if retVal != 0:
86     raise SystemError, "Conversion of %s%s failed" % (front, format)
87    
88     # use ppmtompeg to convert the pnms to a movie
89     print "Making movie"
90    
91     # now automatically generate the ppmtompeg params file
92     print "Generating params file..."
93    
94     # old pattern
95     # PATTERN IBBBPBBBPBBBPBBBPBBB
96    
97     paramsFileString = """REFERENCE_FRAME DECODED
98     FRAME_RATE 24
99     OUTPUT %s
100 cochrane 371 PATTERN %s
101 jgs 123 FORCE_ENCODE_LAST_FRAME
102     GOP_SIZE 20
103     BSEARCH_ALG CROSS2
104     PSEARCH_ALG TWOLEVEL
105     IQSCALE 10
106     PQSCALE 11
107     BQSCALE 16
108     RANGE 8
109     SLICES_PER_FRAME 1
110     BASE_FILE_FORMAT PNM
111     INPUT_DIR .
112     INPUT_CONVERT *
113     INPUT
114 cochrane 371 """ % (mpegName, pattern)
115 jgs 123
116     # need to determine the first number and last number of the list of files
117     # sort the files first just in case
118     fnames.sort()
119     firstFile = fnames[0]
120     lastFile = fnames[-1]
121    
122 jgs 147 r = re.compile("([a-zA-Z-_\.\d])(\\d+)(\\.\\w+)$")
123 jgs 123 firstNum = r.findall(firstFile)
124     firstNum = firstNum[0][1]
125     lastNum = r.findall(lastFile)
126     lastNum = lastNum[0][1]
127    
128 jgs 147
129 jgs 123 # finish off the params file string
130 jgs 147 if pad == 1:
131 jgs 149 paramsFileString += "%s/%s*.pnm [%s-%s]\n" % \
132     (dirname, fnameStem, firstNum, lastNum)
133 jgs 147 elif pad > 1:
134     # positive padding: add duplicate frames (slow the movie down)
135     for i in range(int(firstNum), int(lastNum)+1):
136     for j in range(pad):
137 jgs 149 paramsFileString += "%s/%s%04d.pnm\n" % (dirname, fnameStem, i)
138 jgs 147 elif pad < 1:
139     # negative padding: i.e. remove frames (speed the movie up)
140     for i in range(int(firstNum), int(lastNum)+1, abs(pad)):
141 jgs 149 paramsFileString += "%s/%s%04d.pnm\n" % (dirname, fnameStem, i)
142 jgs 123
143     paramsFileString += """END_INPUT
144     PIXEL HALF
145     ASPECT_RATIO 1
146     """
147    
148     # write the string to file
149 jgs 149 fp = open( "%s/%s.params" % (dirname,fnameStem,), "w" )
150 jgs 123 fp.write(paramsFileString + '\n')
151     fp.close()
152     print "Done params file generation"
153    
154     # now do the conversion to mpeg
155     print "Performing conversion to mpeg"
156 jgs 149 convertString = "ppmtompeg %s/%s.params" % (dirname, fnameStem)
157 jgs 123 result = os.system(convertString)
158     if result != 0:
159     print "An error occurred in mpeg conversion"
160    
161     # now clean up a bit
162     #for i in range(count):
163     # rmFname = "%s_%04d.ppm" % (fnameStem,i)
164     # os.unlink(rmFname)
165    
166     print "\nDone!"
167    

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26