2012年10月4日木曜日

HBVFWSource.dll

P216 VFW ReaderはAviUtl用ですが、こちらはAviSynth用です。

HighBitDepth_VFWSource-0.1.3.7z
https://github.com/chikuzen/HighBitDepth_VFWSource

P010/P016/P210/P216なクリップをVFW使って読み込みます。
読み込まれたクリップはdither hackのinterleaved formatの状態になります。

色変換の手間が要らないのとplanarフォーマットをサポートしてる分、やっぱAviSynthのほうが書きやすかったです。

追記:
やはり色々まずいところがあったようです。
0.1.3を上げたのですでにDLしてしまった人は差し替えて下さい。

P216 VFW Reader for AviUtl

VapourSynthがVFWでP010/P016/P210/P216を出力するようになりました。
これをなるべく高品質でプレビューしたくなったので、AviUtl用の入力プラグインを書きました。

P216_VFW_Reader_for_AviUtl-0.1.0.7z
https://github.com/chikuzen/P216_VFW_Reader_for_AviUtl

使い方はreadmeのほうで。
色変換のコードをいろいろ書くのがメンドイので、P216専用です。
音声もVSが対応してないのでこっちも無視です。

それにしてもVFWって息が長いですね。
最後に仕様が改訂されたのはWindows95の時代ですよ…。

2012年10月1日月曜日

vsavsreader.dll その3

更新しました。

vsavsreader-4dafb1b.7z
https://github.com/chikuzen/VS_AvsReader

*vsavsreaderで作ったクリップをSplice()で結合出来なかったりしたのを修正

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ならばまだ使えます。

2012年9月27日木曜日

vsavsreader.dll その2

更新

vsavsreader-10c62ad.7z
https://github.com/chikuzen/VS_AvsReader

更新といっても中身は変わってないのですが、VapourSynthがr9でAPIのバージョンを上げたのでいままでものは使えなくなりました。
いろいろとバグがとれたりしてるようなので、使ってる人はVSと一緒に更新して下さい。

追記:
ちょっとまずいところがあったようなので、修正版に差し替えました。

2012年9月21日金曜日

VapourSynthでプレビュー

とりあえず現時点ではVapourSynthでクリップのプレビューが出来るエディタ等はないので、間に合わせで書いてみました。

#vsshow.py

import vapoursynth as vs
from ctypes import *
from PIL import Image

def show(core, clip, frame_number, vflip=1):
    format = clip.format.id
    width = clip.width
    height = clip.height
    if format == vs.GRAY16:
        clip = core.resize.Point(clip, width, height, vs.GRAY8)
    if format != vs.GRAY8 and format != vs.RGB24:
        clip = core.resize.Bicubic(clip, width, height, vs.COMPATBGR32)

    format = clip.format.id
    planes = range(clip.format.num_planes)
    frame = clip.get_frame(frame_number)
    data = [(frame.get_read_ptr(p), frame.get_stride(p)) for p in planes]
    buff = [b'\0' * data[p][1] * height for p in planes]
    for p in planes:
        memmove(buff[p], data[p][0], data[p][1] * height)

    if format == vs.COMPATBGR32:
        mode, src = 'RGBA', 'BGRA'
    else:
        mode, src = 'L', 'L'
    img = [Image.frombytes(mode, (width, height), buff[p], 'raw', src,
                           data[p][1], vflip) for p in planes]
    if len(planes) != 1:
        img = Image.merge('RGB', (img[2], img[0], img[1]))
    else:
        img = img[0]

    img.show()

使い方
>>> import vapoursynth as vs
>>> import vsshow
>>> core = vs.Core()
>>> core.std.LoadPlugin('vsavsreader.dll')
>>> clip = core.avsr.Eval('ColorBars()')
>>> vsshow.show(core, clip, 1234)

こんな感じで指定したフレーム番号のフレームがプレビューできます。
vsshow.pyはvapoursynth.pydと同じ場所に置いておけばいいです。
ビューワーにはPIL(Python Imaging Library)の仕様上、.bmpファイルに関連付けされているアプリケーションが使われます(MSペイントだったりPicasaだったりMangameeyaだったり)。
なお、Python3用のPILは、こちらからDLしてインストールして下さい。
フレームがYUVの場合のRGB変換はVS内蔵のswscaleが使われる都合上、BT601のlimitted-range限定です。
色々ひどいと我ながら思いますが、ないよりはマシくらいのおおらかな気持ちで使いましょう。

だれかPySideあたりでもっといいの書いてくれないかしら。


Pythonはいろいろ不慣れでこれだけでも苦労しました(おかげでPythonの学習自体ははかどりましたが)。
Twitterでnu774氏(qaacの中の人)に色々アドバイス頂いたおかげで随分助かりました。

vsavsreader.dll

VapourSynth用のプラグインを書きました。

vsavsreader-8e7f46c.7z
https://github.com/chikuzen/VS_AvsReader

使い方
readmeに具体例を書いてあるので、そちらを読んで下さい。

必要なもの
VapourSynth-r8以降
AviSynth2.6alpha3以降

VapourSynthはAviSynth用プラグインをVapourSynthプラグインとして使えるようになってはいますが、対応しているものは2.5x用のもので、2.6以降専用のプラグインは使えません。
また、2.5x用のプラグインでもAviSynthの内蔵フィルタを利用しているものは出力が若干違ったり(DGDecodeで読み込むと、縦1088が1080にCropされないとか)します。
これを使うことにより、RawSource26.dllのような2.6以降用のプラグイン等もVapourSynthで活用できるようになりますし、DGDecodeを使った入力でもCropを改めて掛ける必要はなくなります。

あくまでもVapourSynthでavsを読み込めるようにするだけなので、勘違いはしないよう注意して下さい。