OSDN Git Service

implement videoframe compliment option.
[rec10/rec10-git.git] / rec10 / trunk / src / tv2audio.py
1 #!/usr/bin/python
2 # coding: UTF-8
3 # Rec10 TS Recording Tools
4 # Copyright (C) 2009-2010 Yukikaze
5 import os
6 import re
7 import configreader
8 import recdblist
9 import commands
10 import os.path
11 import tv2audio
12 import subprocess
13 import signal
14 import traceback
15 def wav2aac_nero(pin,pout):
16     os.environ['LANG']="ja_JP.UTF-8"
17     neroaac=configreader.getpath('NeroAAC')
18     exe=neroaac+" -br 128000 -2pass -if \""+pin+"\" -of \""+pout+"\""
19     try:
20         txt=commands.getoutput(exe.encode('utf-8'))
21         recdblist.addlog(pin, exe, u"Wav2aac_Neroログ-コマンド")
22         recdblist.addlog(pin, txt, u"Wav2aac_Neroログ-詳細")
23     except:
24         if not os.path.exists(pout):
25             lame="lame"
26             exe=lame+" -b 128 \""+pin+"\" \""+pout+"\""
27             txt=commands.getoutput(exe.encode('utf-8'))
28             recdblist.addlog(pin, exe, u"Wav2aac_Lameログ-コマンド")
29             recdblist.addlog(pin, txt, u"Wav2aac_Lameログ-詳細")
30 def wav2mp3_lame(pin,pout):
31     os.environ['LANG']="ja_JP.UTF-8"
32     lame="lame"
33     exe=lame+" -b 128 \""+pin+"\" \""+pout+"\""
34     try:
35         txt=commands.getoutput(exe.encode('utf-8'))
36     except:
37         ""
38     recdblist.addlog(pin, exe, u"Wav2aac_Lameログ-コマンド")
39     recdblist.addlog(pin, txt, u"Wav2aac_Lameログ-詳細")
40 def ts2single_audio(pts,opts):
41     paac=pts.replace(".ts",".aac")
42     ffmpeg=configreader.getpath("ffmpeg")
43     e0=ffmpeg+" -i \""+pts+"\" -y -vn -f aac -acodec copy \""+paac+"\""
44     p0=subprocess.Popen(e0,shell=True)
45     os.waitpid(p0.pid, 0)
46     if p0.poll==None:#実行中
47         if os.path.exists(paac):
48             if os.path.getsize(paac)<1000:#1mで1kb以下の場合自動で終了
49                 try:
50                     logt=unicode(p0.communicate()[0], "UTF-8")
51                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
52                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
53                 except:
54                     ""
55                 recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
56                 os.kill(p0.pid,signal.SIGKILL)
57                 os.remove(paac)
58                 ts2single_mp3_ffmpeg(pts)
59                 if not os.path.exists(pts.replace(".ts",".mp3")):
60                     ts2single_fp_BonTsDemux(pts,opts)
61             else:
62                 logt=unicode(p0.communicate()[0], "UTF-8")
63                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
64                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
65         else:
66             try:
67                 logt=unicode(p0.communicate()[0], "UTF-8")
68                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
69                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
70             except:
71                 ""
72             recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
73             try:
74                 os.kill(p0.pid,signal.SIGKILL)
75             except:
76                 ""
77             ts2single_mp3_ffmpeg(pts)
78             if not os.path.exists(pts.replace(".ts",".mp3")):
79                 ts2single_fp_BonTsDemux(pts,opts)
80     else:
81         if os.path.exists(paac):
82             if os.path.getsize(paac)<1000:#1mで1kb以下の場合自動で終了
83                 try:
84                     logt=unicode(p0.communicate()[0], "UTF-8")
85                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
86                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
87                 except:
88                     ""
89                 recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
90                 os.remove(paac)
91                 ts2single_mp3_ffmpeg(pts)
92                 if not os.path.exists(pts.replace(".ts",".mp3")):
93                     ts2single_fp_BonTsDemux(pts,opts)
94             else:
95                 try:
96                     logt=unicode(p0.communicate()[0], "UTF-8")
97                     recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
98                     recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
99                 except:
100                     ""
101         else:
102             try:
103                 logt=unicode(p0.communicate()[0], "UTF-8")
104                 recdblist.addlog(pts,e0, "FFmpeg音声取り出しログ-コマンド")
105                 recdblist.addlog(pts,logt, "FFmpeg音声取り出しログ-詳細")
106             except:
107                 ""
108             recdblist.Commonlogex("[Error]", "ffmpeg aac getting. (ts2single_audio@tv2audio.py)", u"AAC demux error(ffmpeg)", "", verbose_level=200, log_level=200)
109             ts2single_mp3_ffmpeg(pts)
110             if not os.path.exists(pts.replace(".ts",".mp3")):
111                 ts2single_fp_BonTsDemux(pts,opts)
112 def ts2singlewav(pts,opts):
113     bontsdemux = configreader.getpath('bontsdemux')
114     bonpin = "Z:\\" + pts[1:]
115     outf = os.path.splitext(pts)[0]
116     bonpout = "Z:\\" + outf[1:]
117     xvfb = configreader.getpath('xvfb-run')
118     vf=""
119     delayt="-delay 167 "
120     if re.search(",",opts):
121         vf="-vf "
122     if re.search(".",opts):
123         delayt=""
124     exe = 'wine ' + bontsdemux + " -i \"" + bonpin + "\" "+delayt+" -nd "+vf+"-sound 0 -o \"" + bonpout + "\" -start -quit"
125     #recdblist.printutf8(exe)
126     exe = xvfb + ' -a ' + exe
127     recdblist.printutf8(exe)
128     p=subprocess.Popen(exe.encode('utf-8'),shell=True)
129     os.waitpid(p.pid, 0)
130     logt=unicode(p.communicate()[0], "UTF-8")
131     recdblist.addCommandLog(ots, u"BonTsDemux 音声取り出し", exe, logt)
132 def ts2single_mp3_ffmpeg(pts):
133     pmp3=pts.replace(".ts",".mp3")
134     ffmpeg=configreader.getpath("ffmpeg")
135     e0=ffmpeg+" -i \""+pts+"\" -y -vn -ab 128k \""+pmp3+"\""
136     p0=subprocess.Popen(e0,shell=True)
137     os.waitpid(p0.pid, 0)
138     try:
139         logt=unicode(p0.communicate()[0], "UTF-8")
140         recdblist.addlog(pts,e0, "FFmpeg_mp3音声取り出しログ-コマンド")
141         recdblist.addlog(pts,logt, "FFmpeg_mp3音声取り出しログ-詳細")
142     except:
143         ""
144 def ts2single_fp_BonTsDemux(pts,opts):
145     useNero=0
146     try:
147         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
148             useNero=1
149     except:
150         useNero=0
151     if useNero==1:
152         ts2single_aac_BonTsDemux_Nero(pts,opts)
153     else:
154         ts2single_mp3_BonTsDemux(pts,opts)
155 def ts2single_aac_BonTsDemux_Nero(pts,opts):
156     ts2singlewav(pts,opts)
157     aout=pts.replace(".ts",".aac")
158     ain=pts.replace(".ts",".wav")
159     tv2audio.wav2aac_nero(ain,aout)
160 def ts2single_mp3_BonTsDemux(pts,opts):
161     ts2singlewav(pts,opts)
162     aout=pts.replace(".ts",".mp3")
163     ain=pts.replace(".ts",".wav")
164     tv2audio.wav2mp3_lame(ain,aout)
165 def dualaudio2sep(pin, delay,opts):
166     """
167     delay is string
168     """
169     xvfb = configreader.getpath('xvfb-run')
170     bontsdemux = configreader.getpath('bontsdemux')
171     wine = configreader.getpath('wine')
172     bonpin = "Z:\\" + pin[1:]
173     outf = os.path.splitext(pin)[0]
174     bonpout = "Z:\\" + outf[1:]
175     if re.search(",",opts):
176         vf="-vf "
177     exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay " + delay + " -nd "+vf+"-sound 1 -o \"" + bonpout + "\" -start -quit"
178     recdblist.printutf8(exe)
179     exe = xvfb + ' -a ' + exe
180     txt=commands.getoutput(exe.encode('utf-8'))
181     try:
182         recdblist.addCommandLog(pin, u"BonTsDemux 第一音声取り出し", exe, txt)
183     except:
184         ""
185     ffpin = pin.replace(".ts", "")
186     ffpin1 = pin.replace("ts", "wav")
187     ffpin2 = pin.replace("ts", "m2v")
188     ffpout1 = ffpin + "_1.wav"
189     ffpout2 = ffpin + "_2.wav"
190     ffpout3 = ffpin + ".m2v"
191     shutil.move(ffpin1, ffpout1)
192     exe = 'wine ' + bontsdemux + " -i \"" + bonpin + "\" -delay " + delay + " -nd  "+vf+"-sound 2 -encode Demux\(wav\) -o \"" + bonpout + "\" -start -quit"
193     recdblist.printutf8(exe)
194     exe = xvfb + ' -a ' + exe
195     txt=commands.getoutput(exe.encode('utf-8'))
196     try:
197         recdblist.addCommandLog(pin, u"BonTsDemux 第二音声取り出し", exe, txt)
198     except:
199         ""
200     #os.system(exe)
201     shutil.move(ffpin1, ffpout2)
202     shutil.move(ffpin2, ffpout3)
203     ffpout21=ffpout1.replace(".wav",".mp3")
204     ffpout22=ffpout2.replace(".wav",".mp3")
205     useNero=0
206     try:
207         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
208             useNero=1
209     except:
210         useNero=0
211     if useNero==1:
212         ffpout21=ffpout1.replace(".wav",".aac")
213         ffpout22=ffpout2.replace(".wav",".aac")
214         tv2audio.wav2aac_nero(ffpout1, ffpout21)
215         tv2audio.wav2aac_nero(ffpout2, ffpout22)
216     else:
217         tv2audio.wav2mp3_lame(ffpout1, ffpout21)
218         tv2audio.wav2mp3_lame(ffpout2, ffpout22)
219     time.sleep(3)
220     os.remove(ffpout1)
221     os.remove(ffpout2)
222 def pentaaudio2sep(pin):
223     bontsdemux = configreader.getpath('bontsdemux')
224     wine = configreader.getpath('wine')
225     xvfb = configreader.getpath('xvfb-run')
226     bonpin = "Z:\\" + pin[1:]
227     outf = os.path.splitext(pin)[0]
228     bonpout = "Z:\\" + outf[1:]
229     exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay 167 -nd -sound 3 -o \"" + bonpout + "\" -start -quit"
230     exe = xvfb + ' -a ' + exe
231     recdblist.printutf8(exe)
232     txt=commands.getoutput(exe.encode('utf-8'))
233     try:
234         recdblist.addCommandLog(pin, u"BonTsDemux5.1ch 第一音声取り出し", exe, txt)
235     except:
236         ""
237     ffpin = pin.replace(".ts", "")
238     ffpin1 = pin.replace("ts", "wav")
239     ffpin2 = pin.replace("ts", "m2v")
240     ffpout1 = ffpin + "_1.wav"
241     ffpout2 = ffpin + "_2.aac"
242     shutil.move(ffpin1, ffpout1)
243     exe = "ffmpeg -i '"+pin+"' -vn -f aac -acodec copy '"+ffpout2+"'"
244     recdblist.printutf8(exe)
245     txt=commands.getoutput(exe.encode('utf-8'))
246     try:
247         recdblist.addCommandLog(pin, u"FFmpeg 5.1ch 第二音声(raw AAC)取り出し", exe, txt)
248     except:
249         ""
250     ffpout21=ffpout1.replace(".wav",".mp3")
251     useNero=0
252     try:
253         if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
254             useNero=1
255     except:
256         useNero=0
257     if useNero==1:
258         ffpout21=ffpout1.replace(".wav",".aac")
259         tv2audio.wav2aac_nero(ffpout1, ffpout21)
260     else:
261         tv2audio.wav2mp3_lame(ffpout1, ffpout21)
262     if not os.path.exists(ffpout21):
263         exe = wine + ' ' + bontsdemux + " -i \"" + bonpin + "\" -delay 167 -nd -sound 0 -o \"" + bonpout + "\" -start -quit"
264         exe = xvfb + ' -a ' + exe
265         recdblist.printutf8(exe)
266         txt=commands.getoutput(exe.encode('utf-8'))
267         try:
268             recdblist.addCommandLog(pin, u"BonTsDemux 修正版第二音声(2chDownmix)取り出し", exe, txt)
269         except:
270             ""
271         shutil.move(ffpin1, ffpout1)
272         if useNero==1:
273             ffpout21=ffpout1.replace(".wav",".aac")
274             tv2audio.wav2aac_nero(ffpout1, ffpout21)
275         else:
276             tv2audio.wav2mp3_lame(ffpout1, ffpout21)
277         time.sleep(3)
278     ffpout21=ffpout1.replace(".wav",".aac")
279     if os.path.exists(ffpout21):
280         if os.path.getsize(ffpout21)>10*1000*1000:
281             os.remove(ffpout1)