2013年2月22日金曜日

EasyVFR for VapourSynth

なんかEasyVFRのVS版を欲しがってる人たちがいるようなので、やってみました。

easyvfr.py

使い方

まずeasyvfr.pyをPython3/Lib/site-packagesに置きます。

あとはこんな感じ
#!/usr/bin/env python3

import vapoursynth as vs
import easyvfr

vs.get_core().std.LoadPlugin('/path/to/d2vsource.dll')
d2vsrc = vs.get_core().d2v.Source

def ivtc(clip, offset, cycle=10, tff=True):
    sf = clip.std.SeparateFields(tff)
    dw = sf.std.DoubleWeave(tff)
    return dw.std.SelectEvery(cycle, offset)

def bob(clip, tff=True):
    sf = clip.std.SeparateFields(tff)
    return sf.resize.Bicubic(height=clip.height)


src = d2vsrc('/path/to/the/source.d2v')

# 適当にTrimして、デインタレ/IVTC/Bobしたりする
av0 = ivtc(src[100: 2000], [0, 3, 5, 8]) # 24fps
op0 = ivtc(src[2000: 3456], [0, 2, 5, 7]) # 24fps
op1 = bob(src[3456: 3501]) # 60fps
op2 = ivtc(src[3501: 6541], [1, 4, 6, 9]) # 24fps
a00 = ivtc(src[8000: 12000], [1, 3, 6, 8]) #24fps
a01 = src[12000: 12151] # 30fps
a02 = ivtc(src[12151: 20000], [0, 2, 5, 7]) #24fps

# av0, op0, a00の先頭フレームにチャプタを打ち、IDRフレームにしたい
av0 = easyvfr.ChapterClip(av0, 'アバンA')
op0 = easyvfr.ChapterClip(op0, 'OP')
a00 = easyvfr.ChapterClip(a00, 'Aパート')

# 各クリップをひとつのリストにまとめる
clips = [av0, op0, op1, op2, a00, a01, a02]

'''
22行目以降はこういう書き方もあり
cc = easyvfr.ChapterClip
clips = [
    cc(ivtc(src[100: 2000], [0, 3, 5, 8]), 'アバンA'),
    cc(ivtc(src[2000: 3456], [0, 2, 5, 7]), 'OP'),
    bob(src[3456: 3501]),
    ivtc(src[3501: 6541], [1, 4, 6, 9]),
    cc(ivtc(src[8000: 12000], [1, 3, 6, 8]), 'Aパート'),
    src[12000: 12151],
    ivtc(src[12151: 20000], [0, 2, 5, 7]),
]
'''

# timecodeファイル、chapterファイル、x264用QPファイルの出力、及び各クリップを結合
vfr = easyvfr.EasyVFR(clips)
vfr.write_tcq('/path/to/the/files')
#vfr.write_timecode('/path/to/the/timecode.txt')
#vfr.write_chapter('/path/to/the/chapter.txt')
#vfr.write_qpfile('/path/to/the/qpfile.txt')
vfr.splice_clips().set_output()

timecodeのフォーマットはv2のみです。
chapterファイルのエンコーディングはUTF-8になります。

追記(20160402):最近のVapourSynthにあわせてちょっと書き直しました。