以下の内容2015年10月(Version r28)のものです。古い場合があります。更新日に注意してください。最近割と更新が激しいので内容がすぐ陳腐化するかもしれません。AviSynthは楽に使える人向けの記事です
VapourSynthって何?
AviSynthと同じようなフレームサーバー。AviSynthと同じような機能の内蔵フィルタやプラグインが用意されていますし、AviSynth2.5のプラグインをロードして使用できるので、AviSynthの知識がそのまま流用できます。AviSynthをこのまま改良していくのは大変なので1から作ったのがVapourSynth、がんばって改良しているのがAviSynth+、という認識でいます。
- 32bit版と64bit版が共存可能
- マルチスレッドで動く
- スクリプトはPythonで記述
- 音声は(基本的にまだ)扱えない
- スクリプト内で日本語を使う場合は注意がいる
- AviSynth2.5(32bit)のプラグインを使用可能。64bitは不可
スクリプトはAviSythスクリプトではなくPythonで書くので書式はガラッと変わります(構造自体は割と似てるけれど)。AviSynthに慣れている人でも導入は大変かもしれません。私はPythonがわからない人なので結構苦労しました
VapourSynthの導入
必要なもの
- Python(32bit or 64bit or どっちも)
- VapourSynth
- VapourSynth用のプラグインやスクリプト
- AviSynth2.5(32bit)のプラグイン(使いたい場合)
- AvsPmod or VapourSynth Editor
- x264など
- Pismo File Mount Audit Package(VSFSを使う場合のみ)
Python
まずPythonをいれる必要があります。32bitで動かす場合は32bit版を、64bit版で動かす場合は64bit版を、両方の環境を用意したいのであれば両方入れます。r28以降では3.5.xをインストールするようにしましょう
Pythonをオールユーザー向けにインストールしないとVapourSynthが32bitと64bit同時に使えないことがあるらしい?ので、もしそこで詰まったらPythonのインストールを見直して見て下さい
VapourSynth
左側中段のWindows Binariesをダウンロードしてインストール。インストール時に、コンテキストメニューの新規作成にスクリプトの作成を追加するかどうかと、VapourSynth File Systemの導入が選べます。VapourSynth File Systemを使う場合は先にPismo File Mount Audit Packageをインストールしておきましょう
新規作成に追加した場合、インストール先のtemplate.vpyが名前の通りテンプレになります
プラグイン&スクリプト
AviSynthから移植されているものも多く、同じような感覚で使っていけます。一部AviSynthとは名前が違っているけれど機能としては(一部だったり大部分だったり)同じものがあります。ものによってはAviSynthのプラグイン2つが1つのプラグインに統合されているものもあります。例としては以下の表にあるものたち
AviSynth | VapourSynth |
TIVTC | VIVTC |
dither | fmtconv |
TDeint + TMM | TDeintMod |
MSmooth + MSharpen | MSmooth |
また、nnedi3など、VapourSynthではhigh bitdepth対応になっているプラグインもあります
AviSynth 2.5の欄には互換性があやしいAviSynthプラグインが記載されています。AviSynthのMVTools2を使いたいならAVSTP.dllを消せ、RemoveGrainはVapourSynthのNative Pluginになったからいらない、といった感じですVapourSynth用のプラグインはVapourSynthのインストール先フォルダのPluginフォルダに入れればオートロードされるようになります
外部スクリプトはPythonのインストール先/Libs/site-packages に配置します。32bitと64bit両方使う場合は両方にいれておきましょう。とりあえずAviSynthで有名だった関数が移植されているHAvsFuncは導入しておいて損はないでしょう
AvsPmod
AviSynthスクリプトの編集で有名なAvsPmodですが、拡張子が.vpyのものはVapourSynthスクリプトとみなしてくれるのでVapourSynthのスクリプトを作る場合もAvsPmodが使えます。勿論プレビューも可能です
.vpyはUTF-8のBOM無しで記述する必要があるのですが、AvsPmodでは拡張子.vpyでは自動的にUTF-8のBOM無しで保存してくれます。逆にWindows標準のメモ帳など、UTF-8のBOM無しに対応していないエディタでは作れなくなりました。読めなかった場合はAvsPmodを更新してください
Pismo File Mount Audit Package
VSFSを使う場合のみ。使わない場合は必要ありません。AVFSのVapourSynth版。スクリプトを右クリック→マウントをするとaviファイルとして扱うことができるようになります
スクリプトの書き方
詳しく説明できるほど理解していないのでとりあえず動いたサンプルスクリプトを載せておきます。詳しくは公式等で確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# 2015/05/25 r27 ## 開始前のお約束 import vapoursynth as vs ## 外部スクリプトインポート。これでhavsfunc.pyをインポート import havsfunc ## スタート。スレッド数は省略すると自動でCPUのスレッド数が入る。1でシングルスレッド動作 core = vs.get_core(threads = 8) ## AviSynth2.5のプラグインをロード core.avs.LoadPlugin(r'D:\App\AviSynth 2.5\plugins\delogo.dll') ## ソースロード。d2vの読み込みプラグインが日本語非対応なので、日本語ファイル名を使う場合はエンコードして渡す name = '_d2vfilename_.d2v' name = name.encode('cp932') clip = core.d2v.Source(name) ## L-SMASH Worksの場合 # clip = core.lsmas.LWLibavSource(_filename_, dr=True) # 縦が1088だった場合のみ下8ピクセルをクロップする clip = core.std.CropRel(clip, 0, 0, 0, 8) if clip.height==1088 else clip ## フィールドベース指定 clip = core.std.SetFrameProp(clip, prop="_FieldBased", intval=2) # 1=BFF / 2=TFF ## Trim v1 = core.std.Trim(clip,4977,6175) v2 = core.std.Trim(clip,9773,40640) v3 = core.std.Trim(clip,44238,91559) v4 = core.std.Trim(clip,95607,98332) v5 = core.std.Trim(clip,101930,103727) # v1 = clip.std.Trim(4977,6175) でも可 # v1 = clip[4977:6176] でも可 clip = core.std.Splice([v1, v2, v3, v4, v5]) # clip = v1 + v2 + v3 + v4 + v5 でも可 # clip = clip.std.Trim(4977,6175) + clip.std.Trim(9773, 40640) + ・・・ でも可 ## AviSynthプラグインでのロゴ消し。同様に日本語非対応なので日本語ファイル名を使う場合はエンコード logo = '_logoname_' logo = logo.encode('cp932') clip = core.avs.EraseLOGO(clip, logofile='E:/App/aviutl/logo/logodata.ldp', logoname=logo, start=0, end=83913) ## Bob or IVTC clip = havsfunc.QTGMC(clip, Preset='Fast', TFF=True) # clip = core.std.SeparateFields(clip, TFF=True) # clip = core.std.DoubleWeave(clip, TFF=True) # clip = core.std.SelectEvery(clip, cycle=10, offsets=[0, 2, 5, 7]) ## リサイズ clip = core.resize.Spline(clip , 1280, 720) ## シャープ # clip = havsfunc.LSFmod(clip, defaults='slow', strength=40, dest_x=1280, dest_y=720) ## Return clip.set_output() |
AviSynthのプラグインの場合は core.avs.xxxx だとかVapourSynthの内蔵フィルタの場合は core.std.xxxx などになるとか、AviSynthでは省略できた xxxx = core~のxxxx = が省略できなくなってるとかまぁそんな感じで・・・。DelogoはすでにVapourSynth版があるので実際はそちらを使えばいいのですが、まあAviSynthプラグインを使う例としてそのままにしておきます
AviSynthのDoubleWeaveは、VapourSynthではSeparateFields+DoubleWeaveです
内蔵フィルタがAviSynthに比べて少ない印象です。WeaveやPulldownもありません(他のフィルタの組み合わせて同じ事はできる)。Pythonや他の内蔵フィルタと組み合わせて同じ事ができるもの、は割と省かれてます
エスケープ絡みの注意点
Pythonはクォーテーションで括った文字列でもエスケープシークエンスが使えてしまいます。例えば
core.avs.LoadPlugin(‘D:\App\AviSynth 2.5\plugins\delogo.dll’)
こう書いてしまうと’\’が正しく読めません。Pythonの場合
core.avs.LoadPlugin(r‘D:\App\AviSynth 2.5\plugins\delogo.dll’)
このようにクォーテーションの前にrをつけてやるか
core.avs.LoadPlugin(‘D:/App/AviSynth 2.5/plugins/delogo.dll’)
このように’\’ではなく’/’でパスを表現してあげる必要があります
日本語の使用の注意点
プラグインが日本語に対応していないと基本的に日本語は使えません。使う場合はスクリプト内でUTF-8からcp932にエンコードして渡してあげる必要があります。上記のサンプルは日本語前ファイル名が含まれている前提で書きましたが、d2vファイル名に日本語が含まれていないなら、単に
1 |
clip = core.d2v.Source('xxxxxx.d2v') |
と記述するだけでOKです
インターレース処理の注意点
r27でAssumeT/BFFに相当するものができました
1 |
clip = core.std.SetFrameProp(clip, prop="_FieldBased", intval=2) # BFF=1 / TFF=2 |
このように_FieldBasedプロパティにフィールドオーダーを登録できるようになりました。対応しているフィルタで読み取ってくれます。古いプラグインは読んでくれないので、インターレースがらみの処理をするプラグインは更新しましょう
HAvsFunc
AviSynthでよく使われるスクリプトを移植したものです。AviSynthと同じようにimportして使います。プラグインが移植・更新されるとそれにともない更新されることがあるので、使おうとしてエラーが出たらスクリプトや依存プラグインを更新してみてください。この記事の更新日時点ではr20が最新です
AviSynthではHigh bitdepth未対応だった関数も、HAvsFuncでは対応しているものが多いです
QTGMCの注意点
mvtools2,fmtconv,RemoveGrain,TemporalSoften,SceneChangeが必須です。mvtoolsがVapourSynthに移植されたのでAviSynthのmvtoolsは必要なくなりました
GenericFiltersも内蔵フィルタになったので、外部プラグインのは必要なくなりました。r14まで軽かったけれどr15以降やたらと重くなった気がする・・・
LSFmodの注意点
必須はRemoveGrain,fmtconvです。AviSynth版のmode3-5がmode1-3相当になります
リンギング防止のnoringオプションが追加されています(拡大をAviSynthでいうDither_resize_16nrでやるモード)
音声の扱い
外部プラグインのdambでwav、ogg、flacが一応扱えるようになりましたが、音声まわりはもう少し成熟が見られてからじっくり確認したいと思っているのでとりあえず保留…。1回試しに使ってみましたが、音声の書き出しが映像のエンコードと同期されていたので、音声をneroやqaac等でエンコードする場合は映像のエンコード終了後にすることになります
32bitと64bitの共存
32bitのアプリでvpyファイルにアクセスすると32bitのVapourSynthが、64bitのアプリでvpyファイルにアクセスすると64bitのVapourSynthが動作します。AviSynth+と一緒ですね。当然64bitでエンコード中に32bitのAvsPmodで編集、といった同時使用も可能です
ただ、AviSynthのプラグインが転用できるのは32bit版のみです
x264でエンコード
インストールしたときについてくるvspipeを使うのが公式推奨?パイプなので、32bitのvspipe+64bitのx264みたいな使い方も可能です
1 |
xxxx\VapourSynth\core32\vspipe.exe “xxx.vpy” - --y4m | x264.exe --preset medium --crf 21 - --demuxer y4m -o “xxx.264″ |
直接x264に投げてvfwやvsscriptで読み込んでエンコードもできるようだけれど私の環境だとワーニングが出たりでちょっと気持ち悪かったのでちょっと保留中。x264や環境次第では
1 |
x264.exe --preset medium --crf 21 -o "xxx.264" "xxx.vpy" |
これでもOKなんでしょう
動作状況
AviSynthのMTとは違い、特に何も気にしなくても勝手にマルチスレッドで動作してくれます。マルチスレッドでの動作も安定しています。AviSynthとどちらの方が速いか、は使うプラグイン次第かな?TDeint+TMMはVapourSynthの方が相当速そう。使うプラグインが移植されていれば導入を考える価値は大いにあると思います。最近は本体の開発もプラグイン移植(64bit含め)も活発でエンコード速度も向上しています
内蔵フィルタがAviSynthより用意されているものが少ないですが、PythonさえわかればAviSynthより色々融通が利きます。が、Pythonがわからないと割と大変だと思います
更新履歴
2015/10/29 r28用に更新
2015/05/25 r27用など色々更新&修正加筆
2015/02/09 レイアウト変更とちょっと修正加筆程度。内容はあまり変化なし
コメント