2012年9月30日日曜日

VFW module

VapourSynthのr10で新たにVFWモジュールが追加され、Video for Windows(又はDirectShow)を利用してAVIを読み込むソフトウェアでVSのスクリプトを読み込むことが出来るようになりました。
これによりAvsPmodやVirtualDub等でプレビューできるようになったので、この前書いたプレビュー用スクリプトは(Windowsでは)早くも用済みとなった次第です。いや、大変喜ばしい。

この記事はVapourSynth r18までを対象としています。
r19以降では使い方が一部変更されたので、この記事のとおりではうまくいきません。


VFWモジュールの使い方

1.スクリプトを書く

#sample.vpy
import vapoursynth as vs
core = vs.Core()
core.std.LoadPlugin('C:/foo/bar/ffms2.dll')
clip = core.ffms2.Source('D:/hoge/fuga/video.mp4')
clip = core.resize.Bicubic(clip, clip.width. clip.height, vs.YUV420P8)
last = clip

注意する点

・スクリプト名は普通のPythonのように拡張子".py"ではなく、".vpy"として保存すること。

・VFWモジュールを使う場合、出力先に渡すクリップのインスタンス名は必ず'last'とすること。
'last'以外の名前のクリップは渡せません。

・プラグインやソースファイルの読み込みは、ファイルパスを必ずフルパスで記述すること。
相対パスで扱うのは失敗のもとです。

・VFWで渡せるクリップのフォーマットは8bitのみで、10bitや16bitのものは渡せません。
これはVideo for Windowsが8bit以上のものを扱うことを想定していないことによる制限です。

なお、RGBでもVSのRGB24はplanarフォーマットなので、これも使えません。RGBの場合はCOMPATBGR32に変換する必要があります。

・VFWモジュールを使う際は、クリップのoutputメソッドは使えません。

2.読み込ませる


・AviSynthの場合

AviSynthにvpyを読みこませる場合はAVIFileSource(又はAVISource)を使います。


・VirtualDubの場合

通常のaviやavsと違ってVirtualDubではvpyをD&Dで読み込ませることはできません(拡張子vpyがVirtualDubには登録されていないため)。
VirtualDubのメニューから
File -> Open video file
-> 読み込ませるファイルをダイアログで指定 -> 'ファイルの種類'を'AVIFile input driver(compat)(*.avs,*vdr)'に変更 -> '開く’
と、現時点ではちょっと面倒な手順が必要になります。

追記:
こちらの最新テスト版から、vpyを直で開けるようになりました。

・AviUtlの場合

AviUtl0.99k以降であれば、内蔵の'AVI File Reader(Video for Windows)'、または'DirectShow File Reader'でvpyを読み込むことができます。
ただし、AviUtlですので、クリップのフォーマットはCOMPATYUY2に変換しておきましょう。
なお、vpyになんらかの誤りがあった場合(ファイルパスを相対パスで書いたため、読み込みで不備がおこったとか)、AviUtlが固まってエクスプローラごと落ちて一旦Ctrl+Alt+Delでログオフしなければならなくなったりますので、くれぐれも注意しましょう。


・avconv/ffmpegの場合

avconv/ffmpegはAVIの読み込みにはVFWを使用しませんが、avsの読み込みはVFWを使用します。
よって、これを利用すればvpyをpipeを使わずに渡すことができます。
avconv.exe -f avs -i "d:/herp/derp/sample.vpy" -c:v utvideo out.avi
もっとも、こういったコマンドラインツールはPythonスクリプトから操作するなりしたほうがラクだと思います。
10bitYUVとかの入力にも対応してるし。

追記:
2013年3月以降、ffmpeg.exeではこの方法は使えなくなりました(avs読み込みにVFWを使わなくなったため)。
avconv.exeならばまだ使えます。

5 件のコメント:

  1. AviSynthにvpyを読みこませると以下のようなエラーが出るのですが…

    「Avisynth open failure:Python exception: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence」

    vpyの中身(メモ帳で編集してUTF-8で保存)
    import vapoursynth as vs
    core = vs.Core()
    core.std.LoadPlugin('C:/Program Files (x86)/AviSynth 2.5/plugins/ffms2.dll')
    clip = core.ffms2.Source('E:/test.avi')
    last = clip

    avsの中身
    AVIFileSource("XXX\sample.vpy")

    VapourSynthのバージョンはr14
    aviファイルのコーデックはUtVideo(ULY0)で、音声なし

    返信削除
    返信
    1. 追記です。

      ffms2はFFmpegSource r725 ICL Attempt 4を使用しています。
      aviutlに読み込ませると、赤・緑・青の3色のカラーバーが表示されるだけです(AVI File Reader(Video for Windows)で読み込まれました)。

      削除
  2. 'byte 0xef in position 0'ということは、ファイルの先頭にBOM(Byte Order Mark)の0xFFEFが付いている可能性が高いですね。
    UTF-8にBOMを付けるか否かはいろいろと議論自体はありますが、結局のところは一部のWindows環境以外ではBOM付きUTF-8は使えませんし、今後使われるようになることもないでしょう。
    特にクロスプラットフォームなツールを使う場合はBOMは厳禁です。
    とりあえずUTF-8にBOMを勝手につけるテキストエディタ(メモ帳とか)を使っているのであれば、もうちょっとましなテキストエディタを使ってみて下さい。

    返信削除
    返信
    1. Notepad2-modというテキストエディタを使ったらいけました(EncodingをUTF-8に指定)。
      vpyの編集はメモ帳ではダメですね。

      削除
    2. 別にメモ帳は全くダメというわけでもないですよ。
      そもそも保存形式をANSIにしておけば、日本語版WindowsであればCP932で保存されますので問題はでません。
      結局のところWindowsでUTF-8を扱うのはいろいろと問題が多すぎて無理があるんでしょう。

      削除