ユーザー定義関数 のバックアップソース(No.12)

#contents

*ユーザー定義関数とは? [#wa6e0225]

AviSynthでは、自分自身で関数を定義して、その関数をスクリプト内で呼び出すことができます。

詳しくは、[[ScriptFunctions#jeb5d893]]を参照。

*ユーザー定義関数の使い方 [#r0c763bb]

ユーザー定義関数を使用するための方法には、次の2つがあります。

**1.メインスクリプトの任意の位置に貼り付ける方法 [#uf89764f]

1つ目の方法は、1スクリプト内で、関数の定義と実行の両方を行う方法です。

以下の手順で行います。

+メインスクリプト((フロントエンドに渡すAVSファイルを指します。))内の任意の行に、使用したい関数の「function」から「}」(右中括弧)までの部分(以下、関数の定義部分と記載)を貼り付けます。
+その関数を使用したい行に、関数の実行(設定)行を記述します。

-例:
#code(nonumber)<<EOF
AviSource("hoge.avi") # ソースクリップ
FilterRange(100, 199, "TomsMoComp(1,5,1)") # 関数の実行行
return last

# 以下、関数の定義部分(他の位置に貼り付けてもよい)
function FilterRange(clip "clip", int "start", int "end", string "filter")
{
    c1 = start < 2 ? clip.trim(0, -1) : clip.trim(0, start - 1)
    c2 = Eval("clip.trim(start, end)." + filter)
    c3 = clip.trim(end + 1, 0)
    c = start == 0 ? c2 : c1 + c2
    c = end == 0 ? c : c + c3
    return c
}
EOF

-註:~
関数の実行行は、関数の書式にしたがって記述されなければなりません。関数の書式は、関数の定義部分の「関数名(引数リスト)」から知ることができます。これは[[フィルタの書式]]と同様の形式です([[フィルタの書式]]を参照)。

**2.外部ファイル化して[[インポート>Import]]する方法 [#o7ded8e2]

もう1つの方法は、関数の定義部分を別の外部ファイル(以下、関数定義ファイルと記載)にして、メインのスクリプトにImportする方法です。

上で紹介した1スクリプト内に記述する方法では、複数の関数を利用する場合に、スクリプトが長くなり、見づらくなってしまいます。それに対し、こちらの方法では、関数の定義部分と実行行を分けるため、メインスクリプトが煩雑になるおそれはありません。

以下の手順で行います。

+関数の定義部分をメモ帳にコピー&ペーストします(複数の関数の貼り付けも可)。
+関数定義ファイルを、名前を付けて保存します。拡張子は、avsやavsiなどとしてください。
+メインスクリプト内に関数定義ファイルのImport行と関数の実行行を記述します。

-例:
--メインスクリプト
#code(nonumber)<<EOF
AviSource("hoge.avi") # ソースクリップ
Import("myFunctions.avs") # 関数定義ファイルのインポート
FilterRange(100, 199, "TomsMoComp(1,5,1)") # 関数の実行行
return last
EOF

--関数定義ファイル(myFunctions.avs)
#code(nonumber)<<EOF
function FilterRange(clip "clip", int "start", int "end", string "filter")
{
    c1 = start < 2 ? clip.trim(0, -1) : clip.trim(0, start - 1)
    c2 = Eval("clip.trim(start, end)." + filter)
    c3 = clip.trim(end + 1, 0)
    c = start == 0 ? c2 : c1 + c2
    c = end == 0 ? c : c + c3
    return c
}
EOF

*ユーザー定義関数のリスト [#z517c84e]

ユーザー定義関数のサンプルです(A-Z順)。

|~ |~関数名|~作者|~説明|~備考|
|''A''|[[AddRange]]|2ちゃんねるDTV板「DivX & Avisynth を絶賛しよう 3」の236さん|VirtualDubの編集設定ファイル(vcfファイル)を利用して、選択範囲を指定するための関数。|[[選択範囲の指定方法]]|
|~|ApplyZone|Avisynthを絶賛ιょぅょ Part15の160さん|指定した矩形領域だけにフィルタを適用する関数。||
|~|ApplyZoneRange|Avisynthを絶賛ιょぅょ Part15の160さん|ApplyZoneにフレーム範囲指定機能を追加するためのメタ関数。|ApplyZoneとセットで使用する。|
|~|[[AspectCrop]]|2ちゃんねるDTV板「お前らのショボイAvisynthスクリプト貼ってください」の230さん|アスペクト比を狂わせずにクロップする関数。||
|''B''|[[bbb]]|2ちゃんねるDTV板「Avisynthを絶賛ιょぅょ PART12」の642さん|[[warpsharpプラグイン>warpsharpパッケージ]]のAutoDeintフィルタを利用したBob(60fps化)関数。|[[warpsharpプラグイン>warpsharpパッケージ]]が必要。|
|~|BitrateCalc|qwerpoi|ビットレート計算用関数||
|''F''|FadeIn2Ex|[[kiraru2002:http://members.at.infoseek.co.jp/kiraru2002/]]|[[FadeIn2>Fade]]の機能拡張版。|[[Kiraru2002's Room:http://members.at.infoseek.co.jp/kiraru2002/#script]]|
|~|FadeOut2Ex|[[kiraru2002:http://members.at.infoseek.co.jp/kiraru2002/]]|[[FadeOut2>Fade]]の機能拡張版。|[[Kiraru2002's Room:http://members.at.infoseek.co.jp/kiraru2002/#script]]|
|~|[[FilterRange]]|[[minamina:http://nullinfo.s21.xrea.com/]]|指定範囲にフィルタをかける関数。|http://nullinfo.s21.xrea.com/#script|
|''I''|[[info_modoki]]|[[Kiraru2002:http://members.at.infoseek.co.jp/kiraru2002/]]|ビデオクリップの情報を表示する関数。AviSynthのバージョンに関係なく使用可能。|AviSynth 2.5以降では、[[Info]]フィルタを利用することができる。|

*参考 [#q8611415]
-ShareFunctions
--http://www.avisynth.org/ShareFunctions