2012年7月8日星期日

批量wmv remux到mkv

[update] 某猴子写了一个可以命令行调用的工具,犯不着和graphstudio较劲了
http://otnth.blogspot.com/2012/08/wmv2mkv.html

[original post]
mkvmerge 是不行的,因为某些恶心巴巴的协议问题。
ffmpeg也是不行的,会丢时间戳,虽然remux出来是可以正常拖动的,音画也是同步的,但是拖动非常慢,和原本的wmv一样慢。
唯有gabest的mkv muxer,一个dshow滤镜,mux出来是完全妥的,拖动也十分流畅,但是因为这货是dshow滤镜,所以只能在graphedt或者graphstudio里面手动去连接,每个文件都要做一次打开文件->删掉默认解码滤镜和输出滤镜->添加mkv muxer->添加file writer并指定输出文件名->连接源文件muxer和writer这一大堆的步骤,一两个文件也就算了,几十个文件杀了我算了。
所以写了一个python脚本,把脚本所在文件夹以及子文件夹里面的wmv都转为mkv,另外还需要psutil以及特殊版本的graphstudio(http://blog.thecybershadow.net/2010/06/07/graphstudio-fork/)。
这个graphstudio fork呢虽说支持xml更好了也支持命令行传递过去后台执行,但是有个很严重的问题就是一旦用了/render大法,子进程render完毕后是不会退出的,也不会释放输出文件句柄,所以判断是否mux完毕了确实让我头疼了一会儿。

import os,subprocess,psutil,time
xml="""<?xml version="1.0" encoding="utf-8"?>
<graph name="Unnamed Graph">
    <filter name="File Sink" clsid="{8596E5F0-0DA5-11D0-BD21-00A0C911CE86}">
        <ifilesinkfilter dest="%(dest)s"/>
    </filter>
    <filter name="Matroska Muxer" clsid="{1E1299A2-9D42-4F12-8791-D79E376F4143}"/>
    <filter name="%(src)s" clsid="{187463A0-5BB7-11D3-ACBE-0080C75E246E}">
        <ifilesourcefilter source="%(src)s"/>
    </filter>
    <connect outfilter="Matroska Muxer" outpin="0" infilter="File Sink" inpin="0" direct="true"/>
    <connect outfilter="%(src)s" outpin="0" infilter="Matroska Muxer" inpin="0" direct="true"/>
    <connect outfilter="%(src)s" outpin="1" infilter="Matroska Muxer" inpin="1" direct="true"/>
    <command msg="run"/>
</graph>"""

startupinfo=subprocess.STARTUPINFO()
startupinfo.dwFlags|=subprocess._subprocess.STARTF_USESHOWWINDOW
def convert():
 tmp=os.path.join(os.path.dirname(os.path.realpath(__file__)),'tmp.xml')
 for root,dirs,files in os.walk(os.path.dirname(os.path.realpath(__file__))):
  for f in files:
   if f.endswith('.wmv'):
    fullname=os.path.join(root,f)
    mkv=fullname[:-4]+'.mkv'
    if not os.path.exists(mkv):
     try:
      with open(tmp,'w') as file:
       file.write(xml%{'src':fullname,'dest':mkv})
      popen=subprocess.Popen([r"c:\Program Files\1exe\graphstudio.exe",'/render',tmp],startupinfo=startupinfo)
      ps=psutil.Process(popen.pid)
      orisize=os.path.getsize(fullname)
      print('parsing',f,'...',end='')
      while True:
       p=ps.get_cpu_percent(interval=1)
       # print(p)
       if p<0.1:
        writesize=ps.get_io_counters().write_bytes
        if abs(orisize-writesize)>5*10**6:
         continue
        popen.kill()
        break
       time.sleep(0.1)
      print('... done')
     except subprocess.CalledProcessError as e:
      print(f,'is fucked')
      return
 if os.path.exists(tmp):
  os.remove(tmp)
convert()
另外,由于编码问题,貌似需要py3k
再另外,blogger的html编辑器乱加tag很烦人
再再另外,blogger现在打横幅说Your browser is no longer supported by Blogger. 我只想对google说:你妈逼

没有评论:

发表评论