OSDN Git Service

implement caption/audio 0 byte error auto skip system.
authorgn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Sun, 2 May 2010 07:51:45 +0000 (07:51 +0000)
committergn64_jp <gn64_jp@4e526526-5e11-4fc0-8910-f8fd03428081>
Sun, 2 May 2010 07:51:45 +0000 (07:51 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/rec10@575 4e526526-5e11-4fc0-8910-f8fd03428081

rec10/trunk/src/tv2audio.py
rec10/trunk/src/tv2mp4.py

index d28d310..7f0c793 100644 (file)
@@ -1,5 +1,3 @@
-import commands
-import os.path
 #!/usr/bin/python
 # coding: UTF-8
 # Rec10 TS Recording Tools
@@ -7,6 +5,11 @@ import os.path
 import os
 import configreader
 import recdblist
+import commands
+import os.path
+import tv2audio
+import subprocess
+import signal
 def wav2aac_nero(pin,pout):
     os.environ['LANG']="ja_JP.UTF-8"
     neroaac=configreader.getpath('NeroAAC')
@@ -31,4 +34,42 @@ def wav2mp3_lame(pin,pout):
         txt=txt+commands.getoutput(exe.encode('utf-8'))
     except:
         ""
-    recdblist.addlog(pin, txt, "Wav2aac_Lame log")
\ No newline at end of file
+    recdblist.addlog(pin, txt, "Wav2aac_Lame log")
+def ts2single_audio(pts):
+    ffmpeg=configreader.getpath("ffmpeg")
+    e0=ffmpeg+" -i \""+pts+"\" -vn -f aac -acodec copy \""+paac+"\""
+    p0=subprocess.Popen(e0,shell=True)
+    time.sleep(60)
+    if p0.poll==-1:#実行中
+        if os.path.getsize(paac)<1000:#1mで1kb以下の場合自動で終了
+            os.kill(p0.pid,signal.SIGKILL)
+            os.remove(paac)
+            ts2singlewav(pts)
+            useNero=0
+            try:
+                if configreader.getpath("useNeroAAC")=="1" and os.path.exists(configreader.getpath("NeroAAC")):
+                    useNero=1
+            except:
+                useNero=0
+            if useNero==1:
+                aout=pts.replace(".ts",".aac")
+                ain=pts.replace(".ts",".wav")
+                tv2audio.wav2aac_nero(ain,aout)
+            else:
+                aout=pts.replace(".ts",".mp3")
+                ain=pts.replace(".ts",".wav")
+                tv2audio.wav2mp3_lame(ain,aout)
+        else:
+            os.waitpid(p0.pid, 0)
+def ts2singlewav(pts):
+    bontsdemux = configreader.getpath('bontsdemux')
+    bonpin = "Z:\\" + pts[1:]
+    outf = os.path.splitext(pts)[0]
+    bonpout = "Z:\\" + outf[1:]
+    xvfb = configreader.getpath('xvfb-run')
+    exe = 'wine ' + bontsdemux + " -i \"" + bonpin + "\" -delay 167 -nd -sound 0 -o \"" + bonpout + "\" -start -quit"
+    #recdblist.printutf8(exe)
+    exe = xvfb + ' -a ' + exe
+    recdblist.printutf8(exe)
+    p=subprocess.Popen(exe.encode('utf-8'),shell=True)
+    os.waitpid(p.pid, 0)
index 86d2083..21b7345 100644 (file)
@@ -14,6 +14,9 @@ import time
 import recdblist\r
 import configreader\r
 import status\r
+import subprocess\r
+import signal\r
+import tv2audio\r
 \r
 def ts2mp4(pin, pout, opt):\r
     dir=os.path.split(pout)[0]\r
@@ -52,80 +55,86 @@ def raw2mp4(pin,pout,opt):
     os.environ['LANG']="ja_JP.UTF-8"\r
     if isdualaac==1:\r
         wineexe=configreader.getpath("wine")\r
-        pincap=pin.replace(".264",".srt")\r
-        try:\r
-            cap2ass=configreader.getpath("caption2ass")\r
-        except:\r
-            cap2ass=""\r
+        #pincap=pin.replace(".264",".srt")\r
+        #try:\r
+        #    cap2ass=configreader.getpath("caption2ass")\r
+        #except:\r
+        #    cap2ass=""\r
         pints=pin.replace(".264",".ts")\r
-        paac1=pin.replace(".264","_1.aac")\r
-        paac2=pin.replace(".264","_2.aac")\r
-        recdblist.printutf8(paac1)\r
-        if not os.path.exists(paac1):\r
-            paac1=pin.replace(".264","_1.mp3")\r
-        if not os.path.exists(paac2):\r
-            paac2=pin.replace(".264","_2.mp3")\r
-        e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
+        #paac1=pin.replace(".264","_1.aac")\r
+        #paac2=pin.replace(".264","_2.aac")\r
+        #recdblist.printutf8(paac1)\r
+        #if not os.path.exists(paac1):\r
+        #    paac1=pin.replace(".264","_1.mp3")\r
+        #if not os.path.exists(paac2):\r
+        #    paac2=pin.replace(".264","_2.mp3")\r
+        #e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
         e1=exe +u" "+duration+" -add \""+pin+"\" -new \""+pout+"\""\r
-        e1a1=exe +u" -add \""+paac1+"\" \""+pout+"\""\r
-        e1a2=exe +u" -add \""+paac2+"\" \""+pout+"\""\r
-        e1s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
-        if os.path.isfile(cap2ass):\r
-            txt=txt+execcomd(e0)\r
+        #e1a1=exe +u" -add \""+paac1+"\" \""+pout+"\""\r
+        #e1a2=exe +u" -add \""+paac2+"\" \""+pout+"\""\r
+        #e1s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
+        #if os.path.isfile(cap2ass):\r
+        #    txt=txt+execcomd(e0)\r
         execmp4box(pin, pout, e1)\r
-        addmp4(paac1, pout, e1a1)\r
-        addmp4(paac2, pout, e1a2)\r
-        if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
-            addmp4(pincap, pout, e1s)\r
+        #addmp4(paac1, pout, e1a1)\r
+        #addmp4(paac2, pout, e1a2)\r
+        addAudio(pints, pout, opt)\r
+        addCaption(pints, pout)\r
+        #if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
+        #    addmp4(pincap, pout, e1s)\r
     elif ispentaaudio==1:\r
-        wineexe=configreader.getpath("wine")\r
-        pincap=pin.replace(".264",".srt")\r
-        try:\r
-            cap2ass=configreader.getpath("caption2ass")\r
-        except:\r
-            cap2ass=""\r
+        #wineexe=configreader.getpath("wine")\r
+        #pincap=pin.replace(".264",".srt")\r
+        #try:\r
+        #    cap2ass=configreader.getpath("caption2ass")\r
+        #except:\r
+        #    cap2ass=""\r
         pints=pin.replace(".264",".ts")\r
-        paac1=pin.replace(".264","_1.aac")\r
-        paac2=pin.replace(".264","_2.aac")\r
-        recdblist.printutf8(paac1)\r
-        if not os.path.exists(paac1):\r
-            paac1=pin.replace(".264","_1.mp3")\r
-        if not os.path.exists(paac2):\r
-            paac2=pin.replace(".264","_2.mp3")\r
-        e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
+        #paac1=pin.replace(".264","_1.aac")\r
+        #paac2=pin.replace(".264","_2.aac")\r
+        #recdblist.printutf8(paac1)\r
+        #if not os.path.exists(paac1):\r
+        #    paac1=pin.replace(".264","_1.mp3")\r
+        #if not os.path.exists(paac2):\r
+        #    paac2=pin.replace(".264","_2.mp3")\r
+        #e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
         e1=exe +u" "+duration+" -add \""+pin+"\" -new \""+pout+"\""\r
-        e1a1=exe +u" -add \""+paac1+"\" \""+pout+"\""\r
-        e1a2=exe +u" -add \""+paac2+"\" \""+pout+"\""\r
-        e1s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
-        if os.path.isfile(cap2ass):\r
-            txt=txt+execcomd(e0)\r
+        #e1a1=exe +u" -add \""+paac1+"\" \""+pout+"\""\r
+        #e1a2=exe +u" -add \""+paac2+"\" \""+pout+"\""\r
+        #e1s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
+        #if os.path.isfile(cap2ass):\r
+        #    txt=txt+execcomd(e0)\r
         execmp4box(pin, pout, e1)\r
-        addmp4(paac1, pout, e1a1)\r
-        addmp4(paac2, pout, e1a2)\r
-        if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
-            addmp4(pincap, pout, e1s)\r
+        addAudio(pints, pout, opt)\r
+        #addmp4(paac1, pout, e1a1)\r
+        #addmp4(paac2, pout, e1a2)\r
+        addCaption(pints, pout)\r
+        #if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
+        #    addmp4(pincap, pout, e1s)\r
     else:\r
-        wineexe=configreader.getpath("wine")\r
-        pincap=pin.replace(".264",".srt")\r
-        try:\r
-            cap2ass=configreader.getpath("caption2ass")\r
-        except:\r
-            cap2ass=""\r
+        #wineexe=configreader.getpath("wine")\r
+        #pincap=pin.replace(".264",".srt")\r
+        #try:\r
+        #    cap2ass=configreader.getpath("caption2ass")\r
+        #except:\r
+        #    cap2ass=""\r
         pints=pin.replace(".264",".ts")\r
-        pinaac=pin.replace(".264",".aac")\r
-        e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
-        e1=ffmpeg+" -i \""+pints+"\" -vn -f aac -acodec copy \""+pinaac+"\""\r
+        #pinaac=pin.replace(".264",".aac")\r
+        #e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pints+"\" \"Z:\\"+pincap+"\""\r
+        #e1=ffmpeg+" -i \""+pints+"\" -vn -f aac -acodec copy \""+pinaac+"\""\r
         e2=exe +u" "+duration+" -add \""+pin+"\" -new \""+pout+"\""\r
-        e2a=exe +u" -add \""+pinaac+"\" \""+pout+"\""\r
-        e2s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
-        if os.path.isfile(cap2ass):\r
-            txt=txt+execcomd(e0)\r
-        txttt=execcomd(e1)\r
-        recdblist.addlog(pin, txttt, "get_aac")\r
+        #e2a=exe +u" -add \""+pinaac+"\" \""+pout+"\""\r
+        #e2s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
+        #if os.path.isfile(cap2ass):\r
+        #    txt=txt+execcomd(e0)\r
+        #txttt=execcomd(e1)\r
+        #recdblist.addlog(pin, txttt, "get_aac")\r
         execmp4box(pin, pout, e2)\r
-        addmp4(pinaac, pout, e2a)\r
-        if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
-            addmp4(pincap, pout, e2s)\r
+        addAudio(pints, pout, opt)\r
+        #addmp4(pinaac, pout, e2a)\r
+        addCaption(pints, pout)\r
+        #if os.path.exists(pincap) and (os.path.getsize(pincap)>1000):\r
+        #    addmp4(pincap, pout, e2s)\r
     recdblist.addlog(pout, txt, "mp4box-log")\r
     if status.getSettings_auto_del_tmp()==1:\r
         if os.path.exists(pout):\r
@@ -170,6 +179,48 @@ def mkv2mp4(pin,pout):
         if os.path.exists(pout):\r
             if os.path.getsize(pout)>100*1000*1000:\r
                 deltitle(dir,title)\r
+\r
+def addCaption(pts,pmp4):##字幕の追加を試みる。\r
+    wineexe=configreader.getpath("wine")\r
+    pincap=pts.replace(".ts",".srt")\r
+    try:\r
+        cap2ass=configreader.getpath("caption2ass")\r
+    except:\r
+        cap2ass=""\r
+    if os.path.isfile(cap2ass):\r
+        e0=wineexe+u" "+cap2ass+u" -format srt \"Z:\\"+pts+"\" \"Z:\\"+pincap+"\""\r
+        p0=subprocess.Popen(e0,shell=True)\r
+        time.sleep(120)\r
+        if p0.poll==-1:#実行中\r
+            if os.path.getsize(pincap)<1000:#2mで1kb以下の場合自動で終了\r
+                os.kill(p0.pid,signal.SIGKILL)\r
+            else:\r
+                os.waitpid(p0.pid, 0)\r
+    if os.path.getsize(pincap)>1000:\r
+        exe = configreader.getpath("mp4box")\r
+        e1s=exe +u" -add \""+pincap+"\" \""+pout+"\""\r
+        addmp4(pincap,pmp4,e1s)\r
+def addAudio(pts,pmp4,opt):#オプションに応じた音声の追加を行う\r
+    exe = configreader.getpath("mp4box")\r
+    if re.search("d",opt) or re.search("5",opt):#二カ国語放送/5.1ch放送の場合\r
+        paac1=pts.replace(".ts","_1.aac")\r
+        paac2=pts.replace(".ts","_2.aac")\r
+        recdblist.printutf8(paac1)\r
+        if not os.path.exists(paac1):\r
+            paac1=pts.replace(".ts","_1.mp3")\r
+        if not os.path.exists(paac2):\r
+            paac2=pts.replace(".ts","_2.mp3")\r
+        e1a1=exe +u" -add \""+paac1+"\" \""+pmp4+"\""\r
+        e1a2=exe +u" -add \""+paac2+"\" \""+pmp4+"\""\r
+        addmp4(paac1, pmp4, e1a1)\r
+        addmp4(paac2, pmp4, e1a2)\r
+    else:\r
+        tv2audio.ts2single_audio(pts)\r
+        pinaac=pts.replace(".ts",".aac")\r
+        if os.path.exists(pinaac):\r
+            pinaac=pinaac.replace(".aac",".mp3")\r
+        e1a=exe +u" -add \""+pinaac+"\" \""+pmp4+"\""\r
+        addmp4(paac1, pmp4, e1a)\r
 def execmp4box(pin,pout,cmd):\r
     title=os.path.splitext(os.path.split(pin)[1])[0]\r
     ptin=os.path.join(os.path.dirname(pin),base64.b16encode(title.encode('utf-8'))+".264")\r