お知らせ: にーやんのブログ 2 に移転しました。こちらのブログは、2009 年末までに削除します。

スポンサード リンク

AVSLibのインストール

AVSLib は、AviSynth 用の拡張ライブラリです。詳しいことはわかりませんが、配列(array)を使えるようになったりするようです。

AVSLib については、いずれ AviSynth Wiki でも紹介するつもりですが、ここでは AVSLib のインストール方法だけを簡単に紹介します。これは、AVSLib :: Installation Instructions(英文)を、かなり簡略化したものです。

  1. SourceForge.net: Project Info - AVSLib からダウンロードしたアーカイブを解凍。
  2. フォルダを開いて、setup.vbsの場所を確認。
  3. setup.vbsをダブルクリックして実行。以下のファイルが作成される。
    • rootdir.avsi; 修正してはいけない。
    • template.avs; AVSLibを利用するときは、このavsファイルの内容をスクリプトにコピペする。
    • AVSLibの説明書へのショートカット。

rootdir.avsi と template.avs は、setup.vbs と同じフォルダに、ショートカットはデスクトップに作成されます。

デスクトップにショートカットを作成したくない場合は、setup.vbs の 95 行目の行頭に「'」(アポストロフィ)を付ければ(たぶん)OKです。

'MakeShortcut ShortcutDest, SpFolder, "AVSLib-Docs", ....

これらのファイルは、手動で作成することもできます。

rootdir.avsi

global avslib_root = "X\"

template.avs

Import("X\headers\avslib-h.avsi")

rootdir.avsi と template.avs の内容は、それぞれ上記のようになります。「X」は AVSLib のフォルダ(setup.vbs があるフォルダ)のパスに置き換えてください。

あとは、template.avs の中の Import 文を、そのままスクリプト内にコピー&ペーストすれば、 AVSLib を使用できるようになります。Import 文を貼り付ける場所は、AVSLib のコマンドよりも前にしてください。

使用例

Import("C:\foo\headers\avslib-h.avsi") # template.avs より
AviSource("C:\capture\bar.avi")
EditDelete(2,2)

HowToApplyFilterToManySingleFrames

特定のフレームや範囲にだけフィルタをかけたい場合、AviSynthではApplyRangeフィルタやFilterRange関数を使って、これを行うことができます(参照)。

しかし、その対象フレームや対象範囲が複数に渡るときは、これらのフィルタを何度も呼び出す必要が出てきます。それは、スクリプトを書く手間がかかるだけでなく、AviSynthに負荷をかけてしまうことにもなりかねません。

AviSynth.orgに掲載されているHowToApplyFilterToManySingleFramesを使えば、なるべくAviSynthに負担をかけずに、かつ、比較的簡単に、複数の範囲にフィルタをかけることができます。この方法では、AviSynthに内蔵されているConditionalFilterフィルタとConditionalReaderフィルタを使用します。

ソースクリップ

ソース

例として、このビデオクリップの1フレームと3-4フレームだけに、GreyScaleフィルタを適用したいと思います。GreyScaleフィルタは、ビデオクリップをグレースケールに変換するフィルタです。

スクリプト

global FreezeThis = 0
video = ColorBars(80,60) # ソースクリップ
frozen = video.GreyScale() # 適用したいフィルタ
ConditionalFilter(video, frozen, video, "FreezeThis", "==", "1")
ConditionalReader("Setting.txt", "FreezeThis", false)

ここでは細かい説明は省きますが、「"FreezeThis"」の値が1ならフィルタ適用後のクリップ(frozen)を選択、そうでなければオリジナルのクリップ(video)を選択するという内容になっています(いずれAviSynth Wikiで、もう少し詳しく説明するかもしれません)。

2行目のクリップのパスと3行目の適用したいフィルタ、そして5行目のSetting.txtさえ変更すれば、ほかのフィルタを使用したい場合にも応用できます。

これとは別にSetting.txt(上記スクリプトの5行目で指定)を用意します。これは、"FreezeThis"の値を設定するためのファイルです。

Setting.txtは、次のように記述します。

type int
default 0
1 1
R 3 4 1

1行目:

type int

データがint型(整数)であることを宣言しています。この場合、とくに変更する必要はありません。

2行目:

default 0

デフォルト値を設定しています。指定されなかったフレームには、この値が適用されます。

今回の例では「"FreezeThis"」の値が1ならfrozenを選択することになっているので、デフォルトは0にしておきます。これも変更する必要はありません。

3行目:

3行目以降で、フィルタを適用したいフレーム(または範囲)を指定します。

1 1

左がフレーム番号、右が値です。このように値を1に設定すると、そのフレーム(この場合は1フレーム)ではfrozenが選択されます。

4行目:

R 開始フレーム 終了フレーム 値

範囲を指定したいときは、このように記述します。RはRange(範囲)のRです。

R 3 4 1

例の場合、3から4フレームまでの値を1に設定していることになり、その範囲はfrozenが選ばれることになります。

さらにフレームを指定したい場合は、同様にして設定を追加していきます。

フィルタ適用後

フィルタ適用後フィルタ適用後

上記のスクリプトを実行すると、このようになりました。Setting.txtで指定したフレームだけが、グレースケールになっています。

備考: 複数の範囲にフィルタを適用できるFilterRangeExプラグインもあります。

iFilter(T/B)関数で複数のフィルタを使用する方法

2ちゃんねるのAviSynthスレッドで、少し話題にあがっていたので、補足の意味もこめて説明しておきます。

なお、これは、iFilter(T/B)関数だけでなく、FilterRange関数のように、関数の引数にフィルタを指定するタイプのものに使えます。

1.関数1.関数2.関数3...

MetaFunction("foo().bar()")

一番シンプルなのは、これでしょう。

MetaFunction("""foo("").bar()""")

中の関数が引用符を含む場合は、このように引用符を3つ重ねます。

2.サブ関数の中でフィルタ指定(116さんの方法)

MetaFunction("subfunction()")

function SubFunction(clip c)
{
c
foo()
bar()
return last
}

3.引用符を使ったテクニック

filter_chain = """\
foo("")
bar()
\"""

MetaFunction(filter_chain)

中の関数が引用符を含まない場合は、引用符は1つでもOKです。

これは、stickboyさんが、三項演算子を使った式において複数の条件を指定する方法として紹介されているものです。ほかに、複数行のコメントアウトとしても使えます。

# 例
AviSource("hoge.avi")
"""\
foo()
bar()
\"""
return last

この場合、foo関数とbar関数は適用されません。

なお、3の方法については、いずれWikiの中でも紹介しようと思っています。

参考

ドラッグ&ドロップでShowAUFInfoを実行するバッチ(2)

ドラッグ&ドロップでShowAUFInfoを実行するバッチでは、ドラッグ&ドロップしたAUFファイルの定義ファイルのみを出力するだけだったので、若干、実用性に欠けていました。

そこで、出力される定義ファイルの名前をaufilters.avsにして、2回目以降は、そこに追記するようにしました。

ダウンロードはこちらから→http://niiyan.s8.xrea.com/data/AUFInfo.zip

使い方などについては、付属のreadme.txtを参照。

WindowsXPで動作確認していますが、動作無保証ということで、よろしくお願いします。

global変数がダブる問題(前のエントリを参照)については、replace.vbsというVBScriptを使ってglobal変数を削除することで対応しています。

代わりに、コマンドプロンプトでglobal変数の部分を書き込んで(1回目のドラッグ&ドロップ時のみ)、AviUtlのプラグインフォルダのパスも自動的に設定するようにしています(ドラッグ&ドロップされたプラグインがあるフォルダが指定されます)。これにより、基本的には、avsfilters.avsを修正する必要がなくなります。

なお、replace.vbsに関しては、Tech-Ezo - tomoの「WSH.040 正規表現を使って文字列を置換する」を使わせていただきました。

ドラッグ&ドロップでShowAUFInfoを実行するバッチ

AviUtlフィルタプラグイン(拡張子: auf)をドラッグ&ドロップするだけで、ShowAUFInfoを実行し、LoadAviUtlFilterPlugin形式の関数を出力するためのバッチスクリプト。

WindowsXPで動作確認。Windows2000でも動くと思います。それ以外のOSについては不明です。動作無保証。

@echo off

%~d0
cd "%~dp0"

ShowAUFInfo "%~1"> "%~nx1.avs"

上記のスクリプトをメモ帳にコピー&ペーストして、適当な名前(例: ConvertAUFInfo.bat)を付けて保存します。その際、拡張子はbatにしてください。

もしくは、バッチファイルをこちらからダウンロードすることもできます(ZIP 形式で圧縮)

使い方は、以下の通り:

  1. ConvertAUFInfo.batをShowAUFInfo.exeと同じフォルダに置きます。
  2. 定義ファイルを作成したいAviUtlフィルタプラグイン(例: hoge.auf)をConvertAUFInfo.batのアイコンにドラッグ&ドロップします。
  3. ShowAUFInfo.exeと同じフォルダに、AviUtlフィルタプラグイン用の定義ファイルが出力されます。定義ファイルの名前は、「AviUtlフィルタプラグインの名前.avs」(例: hoge.auf)になります。

あとは、定義ファイルをメモ帳で開いて、「global」で始まる最初の3行(global変数)の設定を行ってから、スクリプトにImportするなどしてください。

ただし、このバッチで作成された各定義ファイルには、同じglobal変数が指定されているため、複数の定義ファイルをImportするとまずいことになるかもしれません(たとえば、各ファイルで設定が異なっている場合など)。

そのため、複数の関数を使いたい場合は、1つの定義ファイルにまとめるなどしたほうがいいでしょう。

うーん・・・あまり楽になってないかも。

(2007-10-23 追記)ZIP 形式で圧縮したものに差し替えました。内容に変更はありません。AviSynth Wiki - ShowAUFInfo実行支援バッチスクリプトには、追記も可能なバッチファイルがあります。

Page 2 of 5: 1 2 3 4 5 »