OSDN Git Service

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