VapourSynthとはffms2でお馴染みのMyrsloikことFredric Mellbin氏によって開発されているもので、
・動画を扱うためのPython3用モジュール。
・AviSynth2.5のプラグインをマルチスレッドで利用できる。
といった特徴があります。
早い話がAviSynthの開発が過去との互換性やらinline-asmやらでMT化も64bit化も一向に進まないので、新しいAviSynthを作ってしまったわけですな。
とりあえず現時点ではまだまだ試作段階ですが、MVTools2やTIVTC(mode次第では)がマルチスレッドで安定して動くあたりを見るに、かなり期待できそうです。
というわけで、試しにこんなのを書いてみました。
#!/bin/env python3 #coding: utf-8 import vapoursynth as vs import subprocess as sp class RawSource(object): def __init__(self, core, path='C:\\AviSynth2\\plugins\\rawsource_2.5x.dll'): self.avs = core.avs if core.list_functions().find('RawSource') == -1: self.avs.LoadPlugin(path=path) def rawsource(self, file): return self.avs.RawSource(file=file) class MVTools(object): def __init__(self, core, path='C:\\AviSynth2\\plugins\\mvtools2.dll'): self.avs = core.avs if core.list_functions().find('MSuper') == -1: self.avs.LoadPlugin(path=path) def superclip(self, clip, pel=2, chroma=True, sharp=2): return self.avs.MSuper(c1=clip, chroma=chroma, sharp=sharp) def analyseclip(self, super, delta, blksize=8, overlap=4): return [[self.avs.MAnalyse( c1=super, delta=d, blksize=blksize, isb=b, overlap=overlap) for b in (True, False)] for d in range(1, delta + 1)] def mdegrain1(self, clip, pel=2, chroma=True, sharp=2, blksize=8, overlap=4, thSAD=400): super = self.superclip(clip, pel, chroma, sharp) vec = self.analyseclip(super, 1, blksize, overlap) return self.avs.MDegrain1( c1=clip, c2=super, c3=vec[0][0], c4=vec[0][1], thSAD=thSAD) def mdegrain2(self, clip, pel=2, chroma=True, sharp=2, blksize=8, overlap=4, thSAD=400): super = self.superclip(clip, pel, chroma, sharp) vec = self.analyseclip(super, 2, blksize, overlap) return self.avs.MDegrain2( c1=clip, c2=super, c3=vec[0][0], c4=vec[0][1], c5=vec[1][0], c6=vec[1][1], thSAD=thSAD) def mdegrain3(self, clip, pel=2, chroma=True, sharp=2, blksize=8, overlap=4, thSAD=400): super = self.superclip(clip, pel, chroma, sharp) vec = self.analyseclip(super, 3, blksize, overlap) return self.avs.MDegrain3( c1=clip, c2=super, c3=vec[0][0], c4=vec[0][1], c5=vec[1][0], c6=vec[1][1], c7=vec[2][0], c8=vec[2][1], thSAD=thSAD) def mflowblur(self, clip, pel=2, chroma=True, sharp=2, blksize = 8, overlap=4, blur=15): super = self.superclip(clip, pel, chroma, sharp) vec = self.analyseclip(super, 1, blksize, overlap) return self.avs.MFlowBlur( c1=clip, c2=super, c3=vec[0][0], c4=vec[0][1], blur=blur) if __name__ == '__main__': core = vs.Core(threads=4) rs = RawSource(core) mvt = MVTools(core) clip = mvt.mdegrain2(rs.rawsource("D:\\source\\derf\soccer.y4m")) cmd = ('D:\\tools\\x264.exe - --demuxer y4m --frames %i' ' --preset ultrafast -o output.mp4' % clip.num_frames) clip.output(sp.Popen(cmd.split(), stdin=sp.PIPE).stdin, y4m=True)
for文やif文、リスト内包表記、そして様々な他のPythonモジュール等が使えるあたり、可能性はAviSynthよりも高そうです。
それにPythonですから、avsと違って仕事や学業等にも汎用的に使えます。
憶えて損はないでしょうね。
0 件のコメント:
コメントを投稿