OSDN Git Service

fix some error.
[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     if re.search("2", opts):
21         dualpass = 1
22     if re.search("H", opts):
23         size = "HD"
24     if re.search("S", opts):
25         size = "SD"
26     if re.search("F", opts):
27         size = "FHD"
28     if re.search("L", opts):
29         size = "Short"
30     if re.search("G", opts):
31         size = "LowHD"
32     if re.search("v", opts):
33         isvfr=1
34     if re.search("a", opts):
35         is24fps=1
36     if re.search("l",opts):
37         islight=1
38     if re.search("d",opts):
39         encode_ffmpeg(pin, pout, size, dualpass)
40     else:
41         encode(pin, pout,size,isvfr,dualpass,is24fps,islight)
42 def encode(pin,pout,size,isvfr,is2pass,is24fps,islight):
43     encvf=""
44     txt=""
45     encvf="-vf yadif=0,pp=l5"
46     harddup=",hqdn3d=2:1:2,unsharp=l3x3:0.75:c3x3:0.75,harddup"
47     ofps="-ofps 30000/1001"
48     fps="-fps 30000/1001"
49     bm=1
50     scale=""
51     x264enc1=":me=dia:subme=4"
52     x264enc2=":frameref=3:subme=8:bframes=3"
53     crf=""
54     if is24fps==1:
55         ofps="-ofps 24000/1001"
56         fps="-fps 30000/1001"
57         encvf="-vf pullup,softskip"
58         harddup=",pp=l5,unsharp=l3x3:0.75:c3x3:0.75,hqdn3d=2:1:2,harddup"
59         bm=1
60         x264enc1=":me=hex:bframes=3"
61         x264enc2=":frameref=6: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"
62     if isvfr==1:
63         ofps="-ofps 60000/1001"
64         fps="-fps 60000/1001"
65         encvf="-vf tfields=1,hqdn3d=2:1:2"
66         #encvf="-vf yadif=1,pp=ac,pp=mb"
67         harddup=",pp=ac,pp=l5,unsharp=l3x3:0.75:c3x3:0.75,harddup"
68         #encvf="-vf pullup,softskip,pp=ac"
69         #encvf="-vf filmdint=io=2997:119880,pp=md"
70         bm=1
71         x264enc1=":me=hex:bframes=3:cqm=jvt"
72         x264enc2=":frameref=3:subme=8:subq=7:8x8dct:direct_pred=auto:me=umh:bframes=3:weight_b:cqm=jvt"
73     if islight==1:
74         x264enc1=":no8x8dct:b-adapt=0:bframes=0:no-cabac:no-deblock:me=dia:partitions=i8x8,i4x4:frameref=1:subme=1:trellis=0:scenecut=0"
75         x264enc2=":no8x8dct:b-adapt=0:bframes=0:no-cabac:no-deblock:me=dia:partitions=i8x8,i4x4:frameref=1:subme=1:trellis=0:scenecut=0"
76     if size == "HD":
77         encvf = encvf + ",scale=1280:720::0:3"+harddup
78         bitrate = "bitrate=" + str(tv2avi.Bitrate_HD*bm)
79         crf="crf=20"
80     elif size == "SD":
81         encvf = encvf + ",scale=720:480::0:3"+harddup
82         bitrate = "bitrate=" + str(tv2avi.Bitrate_SD*bm)
83         crf="crf=20"
84     elif size == "FHD":
85         encvf = encvf + ",scale=1920:1080::0:3"+harddup
86         bitrate = "bitrate=" + str(tv2avi.Bitrate_FHD*bm)
87         crf="crf=22"
88     elif size == "Short":
89         encvf = encvf +harddup
90         bitrate = "bitrate=" + str(tv2avi.Bitrate_Short*bm)
91         crf="crf=20"
92     elif size == "LowHD":
93         encvf = encvf + ",scale=1280:720::0:3"+harddup
94         bitrate = "bitrate=" + str(tv2avi.Bitrate_LowHD*bm)
95         crf="crf=22"
96     else:
97         encvf = encvf + ",scale=1280:720::0:3"+harddup
98         bitrate = "bitrate=" + str(tv2avi.Bitrate_HD*bm)
99         crf="crf=22"
100     if is2pass == 1:
101         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"
102         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 + "\'"
103         pas1exe = "nice -n 19 " + pas1exe
104         pas2exe = "nice -n 19 " + pas2exe
105         recdblist.printutf8(pas1exe)
106         txt=txt+unicode(commands.getoutput(pas1exe.encode('utf-8')),'utf-8')
107         recdblist.printutf8(pas2exe)
108         time.sleep(5)
109         txt=txt+unicode(commands.getoutput(pas2exe.encode('utf-8')),'utf-8')
110     else:
111         pas1exe = "mencoder \'" + pin + "\' -vfm ffmpeg -quiet -sws 9 -ovc x264 " + encvf+" "+fps + " "+ofps+" -x264encopts " + bitrate +x264enc2+":level_idc=42:threads=auto -oac mp3lame -lameopts cbr:br=256 -o \'" + pout + "\'"
112         pas1exe = "nice -n 19 " + pas1exe
113         recdblist.printutf8(pas1exe)
114         txt=txt+unicode(commands.getoutput(pas1exe.encode('utf-8')),'utf-8')
115     logo=pin
116     logo=logo.replace(".sa.avi",".ts")
117     logo=logo.replace(".ts",".log")
118     f=open(logo,'a')
119     s=len(txt)
120     stxt=""
121     if s>100:
122         stxt=txt[s-300:]
123     else:
124         stxt=txt
125     s=stxt.find("\n")
126     if s>0:
127         s=s+len("\n")
128         stxt=stxt[s:]
129     txt="\n####mencoder-log_"+size+"####\n"+stxt
130     f.write(txt.encode('utf-8'))
131     f.close()
132
133 def encode_ffmpeg(pin,pout,size,is2pass):
134     #ffmpeg -i input.m2v -vsync 400 -vcodec h264 -b bitrate k -s sizexsize -deinterlace -
135     #x264enc1=":me=hex:bframes=3"
136     #:frameref=3:subq=7:partitions=all:8x8dct:direct=auto:me=umh:bframes=3:weight_b
137     #directpred 3
138     ffmpeg="ffmpeg"
139     vf1="-me hex -bframes 3 "
140     vf1="-ref 1 -subme 1 -me dia "
141     #vf2="-ref 3 -subq 7 -partitions all -direct auto -me umh -level 42 -profile high -bframes 3 -flags2 8x8dct+bpyramid+wpred+mixed_refs+brdo "
142     #vf2="-vpre hq -refs 3 -subq 7 -partitions all -level 42 -me_method umh -bf 3 -flags2 dct8x8+bpyramid+wpred+mixed_refs "
143     vf2="-vpre hq -level 42 -me_method umh -bf 3 "
144     if size == "HD":
145         s = "-s 1280x720 "
146         bitrate = str(tv2avi.Bitrate_HD)
147         crf="crf=20"
148     elif size == "SD":
149         s ="-s 720x480 "
150         bitrate = str(tv2avi.Bitrate_SD)
151         crf="crf=20"
152     elif size == "FHD":
153         s ="-s 1920x1080 "
154         bitrate = str(tv2avi.Bitrate_FHD)
155         crf="crf=22"
156     elif size == "Short":
157         s= ""
158         bitrate = str(tv2avi.Bitrate_Short)
159         crf="crf=20"
160     elif size == "LowHD":
161         s = "-s 1280x720 "
162         bitrate = str(tv2avi.Bitrate_LowHD)
163         crf="crf=22"
164     else:
165         s = "-s 1280x720 "
166         bitrate = str(tv2avi.Bitrate_LowHD)
167         crf="crf=22"
168     txt=""
169     if is2pass==1:
170         os.environ['LANG']="ja_JP.UTF-8"
171         exe1=ffmpeg+" -y -i \""+pin+"\" -pass 1 -vsync 400 -vcodec libx264 -b "+bitrate+"k "+vf1+s+"-deinterlace -an -passlogfile \'" + pin + ".log\' " + " /dev/null"
172         exe2=ffmpeg+" -y -i \""+pin+"\" -pass 2 -vsync 400 -vcodec libx264 -b "+bitrate+"k "+vf2+s+"-deinterlace -an -passlogfile \'" + pin + ".log\' \"" +pout+"\"" #aviにすべきかどうか
173         txt=txt+exe1+"\n"+exe2+"\m"
174         recdblist.printutf8(exe1)
175         exe1 = "nice -n 19 " + exe1
176         exe2 = "nice -n 19 " + exe2
177         os.system(exe1.encode('utf-8'))
178         os.system(exe2.encode('utf-8'))
179     else:
180         os.environ['LANG']="ja_JP.UTF-8"
181         exe=ffmpeg+" -y -i \""+pin+"\" -vsync 400 -vcodec libx264 -b "+bitrate+"k "+vf2+s+"-deinterlace -an \"" +pout+"\""
182         txt=txt+exe+"\n"
183         exe = "nice -n 19 " + exe
184         os.system(exe.encode('utf-8'))
185     logo=pin
186     logo=logo.replace(".m2v",".ts")
187     logo=logo.replace(".ts",".log")
188     f=open(logo,'a')
189     s=len(txt)
190     stxt=""
191     if s>100:
192         stxt=txt[s-300:]
193     else:
194         stxt=txt
195     s=stxt.find("\n")
196     if s>0:
197         s=s+len("\n")
198         stxt=stxt[s:]
199     txt="\n####dualaudio ffmpeg-log_"+size+"####\n"+stxt
200     f.write(txt.encode('utf-8'))
201     f.close()