FilterRange の変更点

  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • FilterRange へ行く。

#contents

* 説明 [#f348e739]

-指定範囲にフィルタをかける関数。
-以下のコードは、にーやんによる改造版です。
-minamina 氏によるオリジナル版は以下から入手可能:
--[[nullinfo:http://nullinfo.s21.xrea.com/#script]]
-FilterRange改に関しては、[[お前らのショボイAvisynthスクリプト貼ってくださいpart2:http://www.avisynth.info/2chlog/1153487392.html]]の 272 から 282 を参照。
--FilterRange改は、「値が0より小さいときも使えるように変更」したもの。

* 作者 [#f0081700]

-minamina(オリジナル)
-にーやん(改造版)

* コード [#wba29f9c]

** 2010-05-08 版 [#h9c57cde]

#code{{
# FilterRange 改造版
function FilterRange(clip clip, int "start", int "end", string "filter") {
    # 最終フレーム番号の取得
    final_frame = clip.FrameCount() - 1
    # デフォルト値の設定
    start = default(start, 0) # 指定なしなら先頭フレーム
    end = default(end, final_frame) # 指定なしなら最終フレーム
    filter = default(filter, "") # あとで例外処理に使う
    # 例外処理
    Assert(start <= final_frame, "'start' should be less than or equal to " + String(final_frame) + ".")
    Assert(end <= final_frame, "'end' should be less than or equal to " + String(final_frame) + ".")
    Assert((end >= start) || (end == 0), "'end' should be more than or equal to start or 0.")
    Assert(filter != "", "'filter' should be specified.")
    # start から end までを選択してフィルタを適用し c に代入
    c = Eval("clip.trim(start, end)." + filter)
    # start が 0 ならそのまま c のみ、1 ならフレーム 0 と c を結合、それ以外は start より前の範囲と c を結合
    c = (start == 0) ? c
    \ : (start == 1) ? clip.trim(0, -1) + c
    \ : clip.trim(0, start - 1) + c
    # end が 0 か最終フレームなら c のみ、end が -1 かつ start が最終フレームなら c のみ、
    # end が -1 なら c と start より後ろの範囲を結合、さもなければ c と end より後ろの範囲を結合
    c = ((end == 0) || (end == final_frame)) ? c
    \ : ((end == -1) && (start == final_frame)) ? c
    \ : (end == -1) ? c + clip.trim(start + 1, 0)
    \ : c + clip.trim(end + 1, 0)
    # c を返す
    return c
}
}}

** 2008-03-06 版 [#v07db898]

#code{{
# FilterRange 改造版
function FilterRange(clip clip, int "start", int "end", string "filter") {
    # 最終フレーム番号の取得
    final_frame = clip.FrameCount() - 1
    # デフォルト値の設定
    start = default(start, 0) # 指定なしなら先頭フレーム
    end = default(end, final_frame) # 指定なしなら最終フレーム
    filter = default(filter, "") # あとで例外処理に使う
    # 例外処理
    Assert(end <= final_frame, "'end' should be less than or equal to " + String(final_frame) + ".")
    Assert(filter != "", "'filter' should be specified.")
    # start から end までを選択してフィルタを適用し c に代入
    c = Eval("clip.trim(start, end)." + filter)
    # start が 0 ならそのまま c のみ、1 ならフレーム 0 と c を結合、それ以外は start より前の範囲と c を結合
    c = (start == 0) ? c
    \ : (start == 1) ? clip.trim(0, -1) + c
    \ : clip.trim(0, start - 1) + c
    # end が 0 か最終フレームなら c のみ、さもなければ c と end より後ろの範囲を結合
    c = ((end == 0) || (end == final_frame)) ? c
    \ : c + clip.trim(end + 1, 0)
    # c を返す
    return c
}
}}

* シンタックス [#h834ff40]

#code{{
FilterRange(clip clip, int "start", int "end", string "filter")
}}

-引数
--clip: ビデオクリップ
--start: 開始フレーム
--end: 終了フレーム
--filter: 適用するフィルタ

* 使用例 [#iad3c364]

-フレーム 100 から 199 までに適用
#code{{
FilterRange(100, 199, "ColorYUV(cont_u=1,cont_v=1)")
}}

-フィルタの引数に二重引用符が含まれる場合
#code{{
FilterRange(100, 199, """Convolution3D(preset="movieHQ")""") # 外側の二重引用符を 3 つ重ねる
}}

* 関連ページ [#vf1e2ce2]
* 注意 [#scde7167]

-上記の使用例にもあるように、適用したいフィルタの引数に二重引用符が含まれる場合は、外側(つまり FilterRange の filter パラメータの方)の二重引用符を 3 つ重ねます。[[nullinfo:http://nullinfo.s21.xrea.com/]]の「よくある質問」を参照。

* 更新履歴 [#j0ec818d]

-2003/02/17 FilterRange 公開([[minamina:http://nullinfo.s21.xrea.com/#script]])
-2003/08/24 FilterRange 利用時の注意点を記載([[minamina:http://nullinfo.s21.xrea.com/#script]])
-2008-03-26 最終フレームまでを範囲に指定すると 1 フレーム水増しされる問題に対応(にーやん)。
-2010-05-08(にーやん)
--end = -1 の場合に 1 フレームだけフィルタを適用できるようにした(開始フレームのみにフィルタを適用できない問題への対応)。
--start が end より小さい場合(end = 0 を除く)と start が最終フレームより大きい場合にエラーを吐くようにした。

* リンク [#vf1e2ce2]

-[[nullinfo:http://nullinfo.s21.xrea.com/]]
-[[FilterRange で最終フレームまでを範囲に指定すると 1 フレーム水増しされる件 - にーやんのブログ 2:http://d.hatena.ne.jp/niiyan/20080326/1206465355]]
--改造の経緯など。

* その他 [#scde7167]

-上記の使用例にもあるように、適用したいフィルタの引数に二重引用符が含まれる場合は、外側(つまり FilterRange の filter パラメータの方)の二重引用符を 3 つ重ねます。[[nullinfo:http://nullinfo.s21.xrea.com/]]の「よくある質問」を参照。