]> code.delx.au - transcoding/blob - encode.py
Initial attempt at encoding for an ipod
[transcoding] / encode.py
1 #!/usr/bin/env python
2
3 import optparse, subprocess, sys
4
5 codecs = {
6 "x264":
7 [
8 "mencoder", "%(input)s", "-o", "%(output)s",
9 "-vf", "%(filters)s",
10 "-ovc", "x264", "-x264encopts", "pass=%(pass)d:bitrate=%(vbitrate)d:me=umh:partitions=all:trellis=1:subq=7:bframes=1:direct_pred=auto",
11 "-oac", "faac", "-faacopts", "br=%(abitrate)d:mpeg=4:object=2", "-channels", "2", "-srate", "48000",
12 ],
13
14 "ipod":
15 [
16 "mencoder", "%(input)s", "-o", "%(output)s",
17 "-vf", "%(filters)s",
18 "-ovc", "x264", "-x264encopts", "pass=%(pass)d:bitrate=%(vbitrate)d:me=umh:threads=auto:partitions=all:trellis=1:subq=7:bframes=1:direct_pred=auto",
19 "-oac", "faac", "-faacopts", "br=%(abitrate)d:mpeg=4:object=2", "-channels", "2", "-srate", "48000",
20 ],
21
22 "xvid":
23 [
24 "mencoder", "%(input)s", "-o", "%(output)s",
25 "-ffourcc", "DX50",
26 "-vf", "%(filters)s",
27 "-ovc", "xvid", "-xvidencopts", "pass=%(pass)d:bitrate=%(vbitrate)d:vhq=4",
28 "-oac", "mp3lame", "-lameopts", "abr:br=%(abitrate)d",
29 ],
30 }
31
32
33 def parseArgs():
34 for codec in codecs.keys():
35 if sys.argv[0].find(codec) >= 0:
36 break
37 else:
38 codec = "x264"
39
40 parser = optparse.OptionParser(usage="%prog [options] input output")
41 parser.add_option("--dvd", action="store", dest="dvd")
42 parser.add_option("--filters", action="store", dest="filters", default="denoise3d")
43 parser.add_option("--vbitrate", action="store", dest="vbitrate", type="int", default=700)
44 parser.add_option("--abitrate", action="store", dest="abitrate", type="int", default=128)
45 parser.add_option("--chapter", action="store", dest="chapter")
46 parser.add_option("--startpos", action="store", dest="startpos")
47 parser.add_option("--endpos", action="store", dest="endpos")
48 parser.add_option("--audioid", action="store", dest="audioid")
49 parser.add_option("--codec", action="store", dest="codec", default=codec)
50 parser.add_option("--dump", action="store_true", dest="dump")
51 try:
52 opts, (input, output) = parser.parse_args(sys.argv[1:])
53 except:
54 parser.print_usage()
55 sys.exit(1)
56
57 return opts, codec, input, output
58
59 def run(args, dump):
60 if dump:
61 print " ".join(args)
62 else:
63 subprocess.Popen(args).wait()
64
65 def main():
66 opts, codec, input, output = parseArgs()
67 try:
68 cmd = codecs[codec]
69 except:
70 print >>sys.stderr, "Codec '%s' not found!" % codec
71 sys.exit(1)
72
73
74 def insertOpt(opt, var):
75 if var:
76 cmd.insert(1, var)
77 cmd.insert(1, opt)
78 insertOpt("-ss", opts.startpos)
79 insertOpt("-endpos", opts.endpos)
80 insertOpt("-dvd-device", opts.dvd)
81 insertOpt("-chapter", opts.chapter)
82 insertOpt("-aid", opts.audioid)
83
84 subst = {
85 "vbitrate": opts.vbitrate,
86 "abitrate": opts.abitrate,
87 "filters": opts.filters,
88 "input": input,
89 }
90
91 # Pass 1
92 subst["pass"] = 1
93 subst["output"] = "/dev/null"
94 run([x % subst for x in cmd], opts.dump)
95
96 # Pass 2
97 subst["pass"] = 2
98 subst["output"] = output
99 run([x % subst for x in cmd], opts.dump)
100
101 if __name__ == "__main__":
102 main()
103