]> code.delx.au - transcoding/blob - encode.py
Added another version of tomp4 (this one works for xvid)
[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 ### "-ovc", "x264", "-x264encopts", "pass=%(pass)d:bitrate=%(vbitrate)d:me=umh:partitions=+parti4x4+partp8x8+partb8x8:trellis=1:subq=5:bframes=1:direct_pred=auto:threads=0:vbv_maxrate=10000:vbv_bufsize=10000",
15 "ip64":
16 [
17 "mencoder", "%(input)s", "-o", "%(output)s",
18 "-vf", "%(filters)s",
19 "-ovc", "x264", "-x264encopts", "pass=%(pass)d:bitrate=%(vbitrate)d:me=dia:partitions=+parti4x4+partp8x8+partb8x8:trellis=1:subq=5:bframes=1:direct_pred=auto:threads=0:vbv_maxrate=10000:vbv_bufsize=10000",
20 "-oac", "faac", "-faacopts", "br=%(abitrate)d:mpeg=4:object=2", "-channels", "2", "-srate", "48000",
21 ],
22
23 "xvid":
24 [
25 "mencoder", "%(input)s", "-o", "%(output)s",
26 "-ffourcc", "DX50",
27 "-vf", "%(filters)s",
28 "-ovc", "xvid", "-xvidencopts", "pass=%(pass)d:bitrate=%(vbitrate)d:vhq=4",
29 "-oac", "mp3lame", "-lameopts", "abr:br=%(abitrate)d",
30 ],
31
32 "ipxv":
33 [
34 "mencoder", "%(input)s", "-o", "%(output)s",
35 "-vf", "%(filters)s",
36 "-ovc", "xvid", "-xvidencopts", "pass=%(pass)d:bitrate=%(vbitrate)d:vhq=4:turbo:max_bframes=0",
37 "-oac", "faac", "-faacopts", "br=%(abitrate)d:mpeg=4:object=2", "-channels", "2", "-srate", "48000",
38 ],
39 }
40
41
42 def parseArgs():
43 for codec in codecs.keys():
44 if sys.argv[0].find(codec) >= 0:
45 break
46 else:
47 codec = "x264"
48
49 parser = optparse.OptionParser(usage="%prog [options] input output")
50 parser.add_option("--dvd", action="store", dest="dvd")
51 parser.add_option("--filters", action="store", dest="filters", default="denoise3d")
52 parser.add_option("--vbitrate", action="store", dest="vbitrate", type="int", default=700)
53 parser.add_option("--abitrate", action="store", dest="abitrate", type="int", default=128)
54 parser.add_option("--chapter", action="store", dest="chapter")
55 parser.add_option("--startpos", action="store", dest="startpos")
56 parser.add_option("--endpos", action="store", dest="endpos")
57 parser.add_option("--audioid", action="store", dest="audioid")
58 parser.add_option("--codec", action="store", dest="codec", default=codec)
59 parser.add_option("--dump", action="store_true", dest="dump")
60 parser.add_option("--sid", action="store", dest="sid")
61 try:
62 opts, (input, output) = parser.parse_args(sys.argv[1:])
63 except:
64 parser.print_usage()
65 sys.exit(1)
66
67 return opts, codec, input, output
68
69 def run(args, dump):
70 if dump:
71 print " ".join(args)
72 else:
73 subprocess.Popen(args).wait()
74
75 def main():
76 opts, codec, input, output = parseArgs()
77 try:
78 cmd = codecs[codec]
79 except:
80 print >>sys.stderr, "Codec '%s' not found!" % codec
81 sys.exit(1)
82
83
84 def insertOpt(opt, var):
85 if var:
86 cmd.insert(1, var)
87 cmd.insert(1, opt)
88 insertOpt("-ss", opts.startpos)
89 insertOpt("-endpos", opts.endpos)
90 insertOpt("-dvd-device", opts.dvd)
91 insertOpt("-chapter", opts.chapter)
92 insertOpt("-aid", opts.audioid)
93 insertOpt("-sid", opts.sid)
94
95 subst = {
96 "vbitrate": opts.vbitrate,
97 "abitrate": opts.abitrate,
98 "filters": opts.filters,
99 "input": input,
100 }
101
102 # Pass 1
103 subst["pass"] = 1
104 subst["output"] = "/dev/null"
105 run([x % subst for x in cmd], opts.dump)
106
107 # Pass 2
108 subst["pass"] = 2
109 subst["output"] = output
110 run([x % subst for x in cmd], opts.dump)
111
112 if __name__ == "__main__":
113 main()
114