OSDN Git Service

fix ffmpeg encode option.
[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="-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="-level 42 -me_method dia -partitions parti8x8+parti4x4 -refs 1 -trellis 0 "
194         x264enc1="-level 42 -me_method dia -partitions none -refs 1 -trellis 0 "
195         x264enc1=x264enc
196         x264enc2=x264enc
197     elif quality<7:
198         x264enc="-level 42 "
199         x264enc1="-level 42 -me_method dia -partitions none "
200         x264enc1=x264enc
201         x264enc2=x264enc
202     elif quality<9:
203         x264enc="-level 42 -directpred auto -refs 5 -subq 6 -bf 1 -trellis 1 "
204         x264enc1="-level 42 -me_method dia -partitions none -refs 1 -subq 6 -bf 1 -trellis 1 "
205         x264enc1=x264enc
206         x264enc2=x264enc
207     elif quality<11:
208         x264enc="-level 42 -refs 5 -subq 7 -trellis 2 -partitions all -directpred auto -me_method umh -bf 3 "
209         x264enc1="-level 42 -me_method dia -partitions none -refs 1 -subq 7 -trellis 2 -directpred auto -bf 3 "
210         x264enc1=x264enc
211         x264enc2=x264enc
212     if is24fps==1:
213         if quality<3:
214             x264enc="-level 42 -me_method dia -partitions none -refs 1 -scenecut 0 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
215             x264enc1="-level 42 -me_method dia -partitions none -refs 1 -scenecut 0 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
216             x264enc1=x264enc
217             x264enc2=x264enc
218         elif quality<5:
219             x264enc="-level 42 -me_method dia -partitions parti8x8+parti4x4 -refs 1 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
220             x264enc1="-level 42 -me_method dia -partitions none -refs 1 -trellis 0 -deblockalpha 1 -deblockbeta 1 "
221             x264enc1=x264enc
222             x264enc2=x264enc
223         elif quality<7:
224             x264enc="-level 42 -deblockalpha 1 -deblockbeta 1 "
225             x264enc1="-me_method dia -partitions none -vpre hq -level 42 -deblockalpha 1 -deblockbeta 1 "
226             x264enc1=x264enc
227             x264enc2=x264enc
228         elif quality<9:
229             x264enc="-level 42 -directpred auto -refs 5 -subq 6 -bf 1 -trellis 1 -deblockalpha 1 -deblockbeta 1 "
230             x264enc1="-level 42 -directpred auto -me_method dia -partitions none -refs 1 -subq 6 -bf 1 -trellis 1 -deblockalpha 1 -deblockbeta 1 "
231             x264enc1=x264enc
232             x264enc2=x264enc
233         elif quality<11:
234             x264enc="-level 42 -refs 5 -subq 7 -trellis 2 -partitions all -directpred auto -me_method umh -bf 3 -deblockalpha 1 -deblockbeta 1 "
235             x264enc1="-level 42 -refs 1 -subq 7 -trellis 2 -partitions none -directpred auto -me_method dia -bf 3 -deblockalpha 1 -deblockbeta 1 "
236             x264enc1=x264enc
237             x264enc2=x264enc
238     if size == "HD":
239         s = "-s 1280x720 "
240         bitrate = str(tv2avi.Bitrate_HD)
241         crf="crf=20"
242     elif size == "SD":
243         s ="-s 720x480 "
244         bitrate = str(tv2avi.Bitrate_SD)
245         crf="crf=20"
246     elif size == "FHD":
247         s ="-s 1920x1080 "
248         bitrate = str(tv2avi.Bitrate_FHD)
249         crf="crf=22"
250     elif size == "Short":
251         s= ""
252         bitrate = str(tv2avi.Bitrate_Short)
253         crf="crf=20"
254     elif size == "LowHD":
255         s = "-s 1280x720 "
256         bitrate = str(tv2avi.Bitrate_LowHD)
257         crf="crf=22"
258     else:
259         s = "-s 1280x720 "
260         bitrate = str(tv2avi.Bitrate_LowHD)
261         crf="crf=22"
262     txt=""
263     if is2pass==1:
264         os.environ['LANG']="ja_JP.UTF-8"
265         exe1=ffmpeg+" -y -i \""+pin+"\" -pass 1 -vsync 400 -vcodec libx264 -vpre fastfirstpass -b "+bitrate+"k "+x264enc1+s+"-deinterlace -an -f avi /dev/null"
266         exe2=ffmpeg+" -y -i \""+pin+"\" -pass 2 -vsync 400 -vcodec libx264 -vpre hq -b "+bitrate+"k "+x264enc2+s+"-deinterlace -an -f avi \"" +pout+"\"" #aviにすべきかどうか
267         recdblist.printutf8(exe1)
268         exe1 = "nice -n 19 " + exe1
269         exe2 = "nice -n 19 " + exe2
270         txt=txt+u"Cmd : "+exe1+"\n"
271         txtt=""
272         try:
273             txtt=unicode(commands.getoutput(exe1.encode('utf-8')),'utf-8')
274         except:
275             ""
276         txt=txt+txtt
277         recdblist.addlog( pin, txt, "dual audio ffmpeg-log - 1pass")
278         txt=""
279         txt=txt+u"Cmd : "+exe2+"\n"
280         txtt=""
281         try:
282             txtt=unicode(commands.getoutput(exe2.encode('utf-8')),'utf-8')
283         except:
284             ""
285         txt=txt+txtt
286         recdblist.addlog( pin, txt, "dual audio ffmpeg-log - 2pass")
287     else:
288         os.environ['LANG']="ja_JP.UTF-8"
289         exe=ffmpeg+" -y -i \""+pin+"\" -vsync 400 -vcodec libx264 -vpre hq -b "+bitrate+"k "+x264enc+s+"-deinterlace -an \"" +pout+"\""
290         txt=txt+"Cmd : "+exe+"\n"
291         exe = "nice -n 19 " + exe
292         txt=txt+"Cmd : "+exe+"\n"
293         txtt=""
294         try:
295             txtt=unicode(commands.getoutput(exe.encode('utf-8')),'utf-8')
296         except:
297             ""
298         txt=txt+txtt
299         recdblist.addlog( pin, txt, "dual audio ffmpeg-log")
300