OSDN Git Service

fix dual audio bug.
[rec10/rec10-git.git] / rec10 / trunk / src / ts2x264.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009-2010 Yukikaze
5 import commands
6 import os
7 import re
8 import time
9 import tv2avi
10 import recdblist
11 def ts2x264(pin, pout, opts):#sizeは"HD"か"SD"
12     """
13     pinで指定されたファイルをpoutにx264でエンコードして書き出す
14     """
15     dualpass = 0
16     isvfr=0
17     is24fps=0
18     islight=0
19     size="Tall"
20     quality=5
21     if re.search("2", opts):
22         dualpass = 1
23     if re.search("H", opts):
24         size = "HD"
25         quality=7
26     if re.search("S", opts):
27         size = "SD"
28         quality=3
29     if re.search("F", opts):
30         size = "FHD"
31         quality=5
32     if re.search("L", opts):
33         size = "Short"
34         quality=3
35     if re.search("G", opts):
36         size = "LowHD"
37         quality=5
38     if re.search("v", opts):
39         is24fps=1
40     if re.search("a", opts):
41         is24fps=1
42         quality=quality+2
43     if re.search("l",opts):
44         quality=quality-2
45     if re.search("h",opts):
46         quality=quality+2
47     if re.search("d",opts):
48         encode_ffmpeg(pin, pout, size, dualpass ,is24fps , quality)
49     elif re.search("5",opts):
50         encode_ffmpeg(pin, pout, size, dualpass ,is24fps , quality)
51     else:
52         encode(pin, pout,size,dualpass,is24fps,quality)
53 def encode(pin,pout,size,is2pass,is24fps,quality):
54     encvf=""
55     txt=""
56     encvf="-vf yadif=0,pp=l5"
57     harddup=",hqdn3d=2:1:2,unsharp=l3x3:0.75:c3x3:0.75,harddup"
58     ofps="-ofps 30000/1001"
59     fps="-fps 30000/1001"
60     bm=1
61     scale=""
62     bnum=2000
63     if size == "HD":
64         encvf = encvf + ",scale=1280:720::0:3"+harddup
65         bitrate = "bitrate=" + str(tv2avi.Bitrate_HD*bm)
66         bnum=tv2avi.Bitrate_HD*bm
67         crf="crf=20"
68     elif size == "SD":
69         encvf = encvf + ",scale=720:480::0:3"+harddup
70         bitrate = "bitrate=" + str(tv2avi.Bitrate_SD*bm)
71         bnum=tv2avi.Bitrate_SD*bm
72         crf="crf=20"
73     elif size == "FHD":
74         encvf = encvf + ",scale=1920:1080::0:3"+harddup
75         bitrate = "bitrate=" + str(tv2avi.Bitrate_FHD*bm)
76         bnum=tv2avi.Bitrate_FHD*bm
77         crf="crf=22"
78     elif size == "Short":
79         encvf = encvf +harddup
80         bitrate = "bitrate=" + str(tv2avi.Bitrate_Short*bm)
81         bnum=tv2avi.Bitrate_Short*bm
82         crf="crf=20"
83     elif size == "LowHD":
84         encvf = encvf + ",scale=1280:720::0:3"+harddup
85         bitrate = "bitrate=" + str(tv2avi.Bitrate_LowHD*bm)
86         bnum=tv2avi.Bitrate_LowHD*bm
87         crf="crf=22"
88     else:
89         encvf = encvf + ",scale=1280:720::0:3"+harddup
90         bitrate = "bitrate=" + str(tv2avi.Bitrate_HD*bm)
91         bnum=tv2avi.Bitrate_HD*bm
92         crf="crf=22"
93     x264enc=""
94     x264enc1=""
95     x264enc2=""
96
97     if quality<3:
98         x264enc=":me=dia:partitions=none:frameref=1:subme=0:scenecut=0:trellis=0"
99         x264enc1=x264enc
100         x264enc2=x264enc1
101     elif quality<5:
102         x264enc=":me=dia:partitions=i8x8,i4x4:frameref=1:subme=1:trellis=0"
103         x264enc1=x264enc
104         x264enc2=x264enc1
105     elif quality<7:
106         x264enc=""
107         x264enc1=x264enc
108         x264enc2=x264enc1
109     elif quality<9:
110         x264enc=":direct_pred=auto:frameref=5:subme=8:bframes=1:trellis=1"
111         x264enc1=x264enc
112         x264enc2=x264enc1
113     elif quality<11:
114         x264enc=":frameref=5:subme=8:subq=7:trellis=2:partitions=all:8x8dct:direct_pred=auto:me=umh:bframes=3"
115         x264enc1=x264enc
116         x264enc2=x264enc1
117     crf=""
118     if is24fps==1:
119         ofps="-ofps 24000/1001"
120         fps="-fps 30000/1001"
121         encvf="-vf pullup,softskip"
122         harddup=",pp=l5,unsharp=l3x3:0.75:c3x3:0.75,hqdn3d=2:1:2,harddup"
123         bm=1
124         if quality<3:
125             vbv=":vbv_maxrate="+str(bnum*2)
126             x264enc=":me=dia:aq-strength=0.6:deblock=1,1:psy-rd=0.4:partitions=none:frameref=1:subme=0:scenecut=0:trellis=0"
127             x264enc1=x264enc+vbv
128             x264enc2=x264enc1
129         elif quality<5:
130             vbv=":vbv_maxrate="+str(bnum*2)
131             x264enc=":me=dia:aq-strength=0.6:deblock=1,1:psy-rd=0.4:partitions=i8x8,i4x4:frameref=1:subme=1:trellis=0"
132             x264enc1=x264enc+vbv
133             x264enc2=x264enc1
134         elif quality<7:
135             vbv=":vbv_maxrate="+str(bnum*2)
136             x264enc=":aq-strength=0.6:deblock=1,1:psy-rd=0.4"
137             x264enc1=x264enc+vbv
138             x264enc2=x264enc1
139         elif quality<9:
140             vbv=":vbv_maxrate="+str(bnum*2)
141             x264enc=":direct_pred=auto:aq-strength=0.6:deblock=1,1:psy-rd=0.4:frameref=5:subme=8:bframes=1:trellis=1"
142             x264enc1=x264enc+vbv
143             x264enc2=x264enc1
144         elif quality<11:
145             vbv=":vbv_maxrate="+str(bnum*2)
146             x264enc=":frameref=5:subme=8:subq=7:trellis=2:aq-strength=0.6:deblock=1,1:psy-rd=0.4:partitions=all:8x8dct:direct_pred=auto:me=umh:bframes=3"
147             x264enc1=x264enc+vbv
148             x264enc2=x264enc1
149     if is2pass == 1:
150         pas1exe = "mencoder \'" + pin + "\' -vfm ffmpeg -quiet -nosound -sws 9 -ovc x264 " + encvf +" "+fps+" "+ofps+" -x264encopts " + bitrate +x264enc1+ ":threads=auto:level_idc=42:pass=1:turbo=2 -passlogfile \'" + pin + ".log\' " + " -o /dev/null"
151         pas2exe = "mencoder \'" + pin + "\' -vfm ffmpeg -quiet -sws 9 -ovc x264 " + encvf +" "+fps+ " "+ofps+" -x264encopts " + bitrate +x264enc2+ ":level_idc=42:threads=auto:pass=2 -passlogfile \'" + pin + ".log\' -oac mp3lame -lameopts cbr:br=256 -o \'" + pout + "\'"
152         pas1exe = "nice -n 19 " + pas1exe
153         pas2exe = "nice -n 19 " + pas2exe
154         recdblist.printutf8(pas1exe)
155         txt=txt+"Cmd : "+pas1exe+"\n"
156         txtt=""
157         try:
158             txtt=unicode(commands.getoutput(pas1exe.encode('utf-8')),'utf-8')
159         except:
160             ""
161         txt=txt+txtt
162         recdblist.printutf8(pas2exe)
163         time.sleep(5)
164         txtt=""
165         try:
166             txtt=unicode(commands.getoutput(pas2exe.encode('utf-8')),'utf-8')
167         except:
168             ""
169         txt=txt+txtt
170     else:
171         pas1exe = "mencoder \'" + pin + "\' -vfm ffmpeg -quiet -sws 9 -ovc x264 " + encvf+" "+fps + " "+ofps+" -x264encopts " + bitrate +x264enc+":level_idc=42:threads=auto -oac mp3lame -lameopts cbr:br=256 -o \'" + pout + "\'"
172         pas1exe = "nice -n 19 " + pas1exe
173         recdblist.printutf8(pas1exe)
174         txt=txt+"Cmd : "+pas1exe+"\n"
175         txtt=""
176         try:
177             txtt=unicode(commands.getoutput(pas1exe.encode('utf-8')),'utf-8')
178         except:
179             ""
180         txt=txt+txtt
181     recdblist.addlog( pin, txt, "mencoder-log")
182
183 def encode_ffmpeg(pin,pout,size,is2pass,is24fps,quality):
184     """
185     
186     """
187     ffmpeg="ffmpeg"
188     if quality<3:
189         x264enc="-vpre hq -level 42 -me_method dia -partitions none -refs 1 -scenecut 0 -trellis 0 "
190         x264enc1=x264enc
191         x264enc2=x264enc1
192     elif quality<5:
193         x264enc="-vpre hq -level 42 -me_method dia -partitions parti8x8+parti4x4 -refs 1 -trellis 0 "
194         x264enc1=x264enc
195         x264enc2=x264enc1
196     elif quality<7:
197         x264enc="-vpre hq -level 42 "
198         x264enc1=x264enc
199         x264enc2=x264enc1
200     elif quality<9:
201         x264enc="-vpre hq -level 42 -directpred auto -refs 5 -subq 6 -bf 1 -trellis 1 "
202         x264enc1=x264enc
203         x264enc2=x264enc1
204     elif quality<11:
205         x264enc="-vpre hq -level 42 -refs 5 -subq 7 -trellis 2 -partitions all -directpred auto -me_method umh -bf 3 "
206         x264enc1=x264enc
207         x264enc2=x264enc1
208     if is24fps==1:
209         if quality<3:
210             x264enc="-vpre hq -level 42 -me_method dia -partitions none -refs 1 -scenecut 0 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
211             x264enc1=x264enc
212             x264enc2=x264enc1
213         elif quality<5:
214             x264enc="-vpre hq -level 42 -me_method dia -partitions parti8x8+parti4x4 -refs 1 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
215             x264enc1=x264enc
216             x264enc2=x264enc1
217         elif quality<7:
218             x264enc="-vpre hq -level 42 -deblockalpha 1 -deblockbeta 1 "
219             x264enc1=x264enc
220             x264enc2=x264enc1
221         elif quality<9:
222             x264enc="-vpre hq -level 42 -directpred auto -refs 5 -subq 6 -bf 1 -trellis 1 -deblockalpha 1 -deblockbeta 1 "
223             x264enc1=x264enc
224             x264enc2=x264enc1
225         elif quality<11:
226             x264enc="-vpre hq -level 42 -refs 5 -subq 7 -trellis 2 -partitions all -directpred auto -me_method umh -bf 3 -deblockalpha 1 -deblockbeta 1 "
227             x264enc1=x264enc
228             x264enc2=x264enc1
229     if size == "HD":
230         s = "-s 1280x720 "
231         bitrate = str(tv2avi.Bitrate_HD)
232         crf="crf=20"
233     elif size == "SD":
234         s ="-s 720x480 "
235         bitrate = str(tv2avi.Bitrate_SD)
236         crf="crf=20"
237     elif size == "FHD":
238         s ="-s 1920x1080 "
239         bitrate = str(tv2avi.Bitrate_FHD)
240         crf="crf=22"
241     elif size == "Short":
242         s= ""
243         bitrate = str(tv2avi.Bitrate_Short)
244         crf="crf=20"
245     elif size == "LowHD":
246         s = "-s 1280x720 "
247         bitrate = str(tv2avi.Bitrate_LowHD)
248         crf="crf=22"
249     else:
250         s = "-s 1280x720 "
251         bitrate = str(tv2avi.Bitrate_LowHD)
252         crf="crf=22"
253     txt=""
254     if is2pass==1:
255         os.environ['LANG']="ja_JP.UTF-8"
256         exe1=ffmpeg+" -y -i \""+pin+"\" -pass 1 -vsync 400 -vcodec libx264 -b "+bitrate+"k "+x264enc1+s+"-deinterlace -an -f avi -passlogfile \'" + pin + ".log\' " + " /dev/null"
257         exe2=ffmpeg+" -y -i \""+pin+"\" -pass 2 -vsync 400 -vcodec libx264 -b "+bitrate+"k "+x264enc2+s+"-deinterlace -an -passlogfile \'" + pin + ".log\' \"" +pout+"\"" #aviにすべきかどうか
258         recdblist.printutf8(exe1)
259         exe1 = "nice -n 19 " + exe1
260         exe2 = "nice -n 19 " + exe2
261         txt=txt+u"Cmd : "+exe1+"\n"+exe2+"\n"
262         txtt=""
263         try:
264             txtt=unicode(commands.getoutput(exe1.encode('utf-8')),'utf-8')
265         except:
266             ""
267         txt=txt+txtt
268         txtt=""
269         try:
270             txtt=unicode(commands.getoutput(exe2.encode('utf-8')),'utf-8')
271         except:
272             ""
273         txt=txt+txtt
274     else:
275         os.environ['LANG']="ja_JP.UTF-8"
276         exe=ffmpeg+" -y -i \""+pin+"\" -vsync 400 -vcodec libx264 -b "+bitrate+"k "+x264enc+s+"-deinterlace -an \"" +pout+"\""
277         txt=txt+"Cmd : "+exe+"\n"
278         exe = "nice -n 19 " + exe
279         txt=txt+"Cmd : "+exe+"\n"
280         txtt=""
281         try:
282             txtt=unicode(commands.getoutput(exe.encode('utf-8')),'utf-8')
283         except:
284             ""
285         txt=txt+txtt
286     recdblist.addlog( pin, txt, "dual audio ffmpeg-log")
287