/[escript]/branches/RW_WIN32/tools/vizTools/make_movie.py
ViewVC logotype

Contents of /branches/RW_WIN32/tools/vizTools/make_movie.py

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.26