OSDN Git Service

implement encode tester.
[rec10/rec10-git.git] / rec10 / trunk / src / tv2mp4.py
1 #!/usr/bin/python\r
2 # coding: UTF-8\r
3 # Rec10 TS Recording Tools\r
4 # Copyright (C) 2009-2010 Yukikaze\r
5 import commands\r
6 import shutil\r
7 import auto_process\r
8 import os\r
9 import re\r
10 import os.path\r
11 import string\r
12 import base64\r
13 import time\r
14 import subprocess\r
15 \r
16 import tv2avi\r
17 import recdblist\r
18 import configreader\r
19 import status\r
20 import tv2audio\r
21 \r
22 def ts2mp4(pin, pout, opt):\r
23     dir=os.path.split(pout)[0]\r
24     title=os.path.split(pout)[1]\r
25     title=os.path.splitext(title)[0]\r
26     tpraw=os.path.join(dir, title+".264")\r
27     tpmp4=os.path.join(dir, title+".mp4")\r
28     if os.path.isfile(pin) and os.path.getsize(pin)>10*1000:\r
29         tv2avi.ts2raw(pin, tpraw, opt)\r
30         time.sleep(10)\r
31         if os.path.isfile(tpraw) and os.path.getsize(tpraw)>10*1000:\r
32             raw2mp4(tpraw, tpmp4, opt)\r
33         time.sleep(10)\r
34         if os.path.exists(tpraw):\r
35             os.remove(tpraw)\r
36 def raw2mp4(pin,pout,opt):\r
37     dir=os.path.split(pout)[0]\r
38     title=os.path.split(pout)[1]\r
39     title=os.path.splitext(title)[0]\r
40     duration="-fps 29.970030 "\r
41     if re.search("a",opt):\r
42         duration="-fps 23.976023 "\r
43     elif re.search("v",opt):\r
44         duration="-fps 23.976023 "\r
45     if re.search("d",opt):\r
46         duration="-fps 29.970030 "##ffmpegが24fpsに対応していないための措置\r
47     elif re.search("5",opt):\r
48         duration="-fps 29.970030 "##ffmpegが24fpsに対応していないための措置\r
49     exe = configreader.getpath("mp4box")\r
50     txt=""\r
51     os.environ['LANG']="ja_JP.UTF-8"\r
52     pints=pin.replace(".264",".ts")\r
53     e1=exe +u" "+duration+" -add \""+pin+"\" -new \""+pout+"\""\r
54     execmp4box(pin, pout, e1)\r
55     addAudio(pints, pout, opt)\r
56     addCaption(pints, pout)\r
57     #recdblist.addlog(pout, txt, "mp4boxログ-コマンド")\r
58     #recdblist.addlog(pout, txt, "mp4boxログ-詳細")\r
59     if status.getSettings_auto_del_tmp()==1:\r
60         if os.path.exists(pout):\r
61             if re.search(opt,"MW8") or re.search(opt,"MW9"):\r
62                 auto_process.deltmpfile(dir, title, ".mp4")\r
63             elif re.search(opt,"8") or re.search(opt,"9"):\r
64                 ""\r
65             else:\r
66                 auto_process.deltmpfile(dir, title, ".mp4")\r
67 def mkv2mp4(pin,pout):\r
68     exeb = configreader.getpath(u"mkvextract")\r
69     exe = configreader.getpath(u"mp4Box")\r
70     #dtsedit=configreader.getpath("DtsEdit")\r
71     wineexe=configreader.getpath("wine")\r
72     dir=os.path.split(pin)[0]\r
73     title=os.path.split(pin)[1]\r
74     title=os.path.splitext(title)[0]\r
75     etitle=base64.b16encode(title.encode('utf-8'))\r
76     audiopath=os.path.join(dir,etitle+u"_audio.aac")\r
77     videopath=os.path.join(dir,etitle+u"_video.264")\r
78     timecodepath=os.path.join(dir,etitle+u"_1_timecode.txt")\r
79     tmpmp4=os.path.join(dir,etitle+u".tmp.mp4")\r
80     exe0=exeb+u" tracks \'"+pin+u"\' 1:\'"+videopath+u"\' 2:\'"+audiopath+u"\'"\r
81     exe1=exeb+u" timecodes_v2 \'"+pin+"\' 1:\'"+timecodepath+"\'"\r
82     exe2=exe+u" -fps 29.970030 -add \'"+videopath+u"\' -add \'"+audiopath+u"\' -new \'"+tmpmp4+u"\'"\r
83     exe3=wineexe+u" "+dtsedit+u" -tc \'Z:\\"+timecodepath+u"\' \'Z:\\"+tmpmp4+u"\' -o \'Z:\\"+pout+u"\'"\r
84     os.environ['LANG']="ja_JP.UTF-8"\r
85     txt=""\r
86     try:\r
87         txt=txt+execcomd(exe0)+"\n"\r
88         txt=txt+execcomd(exe1)+"\n"\r
89         txt=txt+execcomd(exe2)+"\n"\r
90         txt=txt+execcomd(exe3)+"\n"\r
91     except:\r
92         ""\r
93     recdblist.addlog(pin, txt, u"MKV2MP4-log")\r
94     txt = "\n####MKV2MP4-log####\n"+txt\r
95     time.sleep(10)\r
96     if status.getSettings_auto_del_tmp()==1:\r
97         if os.path.exists(pout):\r
98             auto_process.deltmpfile(dir, title, ".mp4")\r
99 def addCaption(pts,pmp4):##字幕の追加を試みる。\r
100     wineexe=configreader.getpath("wine")\r
101     pincap=pts.replace(".ts",".srt")\r
102     try:\r
103         cap2ass=configreader.getpath("caption2ass")\r
104     except:\r
105         cap2ass=""\r
106     if os.path.isfile(cap2ass):\r
107         e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pts+"\" \"Z:\\"+pincap+"\""\r
108         recdblist.printutf8(e0)\r
109         p0=subprocess.Popen(e0,shell=True,stdout=subprocess.PIPE)\r
110         time.sleep(100)\r
111         if p0.poll==None:#実行中\r
112             #if os.path.getsize(pincap)<1000:#2mで1kb以下の場合自動で終了\r
113              #   os.kill(p0.pid,signal.SIGKILL)\r
114             #else:\r
115             os.waitpid(p0.pid, 0)\r
116             logt=unicode(p0.communicate()[0], "UTF-8")\r
117             recdblist.addlog(pts,e0, u"Captionログ-コマンド")\r
118             recdblist.addlog(pts,logt, u"Captionログ-詳細")\r
119         if os.path.exists(pincap):\r
120             if os.path.getsize(pincap)>1000:\r
121                 exe = configreader.getpath("mp4box")\r
122                 e1s=exe +u" -add \""+pincap+"\" \""+pmp4+"\""\r
123                 addmp4(pincap,pmp4,e1s)\r
124 def addAudio(pts,pmp4,opt):#オプションに応じた音声の追加を行う\r
125     exe = configreader.getpath("mp4box")\r
126     if re.search("d",opt) or re.search("5",opt):#二カ国語放送/5.1ch放送の場合\r
127         paac1=pts.replace(".ts","_1.aac")\r
128         paac2=pts.replace(".ts","_2.aac")\r
129         recdblist.printutf8(paac1)\r
130         if not os.path.exists(paac1):\r
131             paac1=pts.replace(".ts","_1.mp3")\r
132         if not os.path.exists(paac2):\r
133             paac2=pts.replace(".ts","_2.mp3")\r
134         e1a1=exe +u" -add \""+paac1+"\" \""+pmp4+"\""\r
135         e1a2=exe +u" -add \""+paac2+"\" \""+pmp4+"\""\r
136         addmp4(paac1, pmp4, e1a1)\r
137         addmp4(paac2, pmp4, e1a2)\r
138     else:\r
139         tv2audio.ts2single_audio(pts)\r
140         pinaac=pts.replace(".ts",".aac")\r
141         if not os.path.exists(pinaac):\r
142             pinaac=pinaac.replace(".aac",".mp3")\r
143         e1a=exe +u" -add \""+pinaac+"\" \""+pmp4+"\""\r
144         addmp4(pinaac, pmp4, e1a)\r
145 def execmp4box(pin,pout,cmd):\r
146     title=os.path.splitext(os.path.split(pin)[1])[0]\r
147     nt=base64.b16encode(title.encode('utf-8'))\r
148     if len(nt)>200:\r
149         nt=nt[:180]\r
150     ptin=os.path.join(os.path.dirname(pin),nt+".264")\r
151     recdblist.printutf8(ptin)\r
152     shutil.move(pin,ptin)\r
153     time.sleep(10)\r
154     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
155     cmdn=string.replace(cmd,pin,ptin)\r
156     cmdn=string.replace(cmdn,pout,ptout)\r
157     recdblist.printutf8(cmdn)\r
158     txt=""\r
159     try:\r
160         txt=execcomd(cmdn)\r
161     except Exception, inst:\r
162         txt= "error occures in execmp4box\n"\r
163         txt=txt+ str(type(inst))+"\n"\r
164         txt=txt+str(inst)\r
165     recdblist.addlog(pin, cmdn, u"MP4Boxログ-コマンド")\r
166     recdblist.addlog(pin, txt, u"MP4Boxログ-詳細")\r
167     time.sleep(5)\r
168     shutil.move(ptin,pin)\r
169     shutil.move(ptout,pout)\r
170     time.sleep(5)\r
171 def addmp4(padd,pout,cmd):#without video\r
172     title=os.path.splitext(os.path.split(padd)[1])[0]\r
173     ext=os.path.splitext(os.path.split(padd)[1])[1]\r
174     nt=base64.b16encode(title.encode('utf-8'))\r
175     if len(nt)>200:\r
176         nt=nt[:180]\r
177     ptadd=os.path.join(os.path.dirname(padd),nt+ext)\r
178     ptoutb=os.path.join(os.path.dirname(pout),nt+"_b.mp4")\r
179     ptout=os.path.join(os.path.dirname(pout),nt+".mp4")\r
180     shutil.move(padd,ptadd)\r
181     if os.path.isfile(pout):\r
182         shutil.move(pout,ptoutb)\r
183     time.sleep(5)\r
184     cmdn=string.replace(cmd,padd,ptadd)\r
185     cmdn=string.replace(cmdn,u"-out \""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
186     cmdn=string.replace(cmdn,u"\""+pout,u"-add \""+ptoutb+"\" -new \""+ptout)\r
187     cmdn=string.replace(cmdn,pout,ptout)\r
188     recdblist.printutf8(cmdn)\r
189     txt=""\r
190     try:\r
191         txt=execcomd(cmdn)\r
192     except Exception, inst:\r
193         txt= "error occures in addmp4\n"\r
194         txt=txt+ str(type(inst))+"\n"\r
195         txt=txt+str(inst)\r
196     recdblist.addlog(pout, cmdn, u"MP4Box追加ログ-コマンド")\r
197     recdblist.addlog(pout, txt, u"MP4Box追加ログ-詳細")\r
198     time.sleep(5)\r
199     shutil.move(ptadd,padd)\r
200     if os.path.exists(ptout):\r
201         shutil.move(ptout,pout)\r
202         os.remove(ptoutb)\r
203     else:\r
204         txtt=padd+u"のインポートエラー"\r
205         recdblist.addlog(pout, txtt, u"MP4Box追加ログ-コマンド")\r
206         shutil.move(ptoutb,pout)\r
207     time.sleep(5)\r
208 def execcomd(cmd):\r
209     txt=""\r
210     try:\r
211         txt=u"Cmd : "+cmd+"\n"\r
212         txt2=commands.getoutput(cmd.encode('utf-8'))\r
213         txt=txt+unicode(txt2,"utf-8")+"\n"\r
214     except:\r
215         ""\r
216     return txt