Avisynth ユーザー定義関数 (指定範囲(指定フレーム)のみにフィルターを掛ける)

ソフトウェア
スポンサーリンク

概要

指定フレームのみにフィルターを適用を適用したい場面ってありませんか?

もし特定のフレーム数(例えば8200~8299フレーム目だけ)にフィルターをかけたい場合、順当に処理するならば

AviSource("sample.avi")
Trim(0,8199) ++ Trim(8200,8299) ++ Trim(8300,0)
return last

という風に記載する必要があります。そんな複雑な記述でなないので毎回書いてもいいのだが、何度も使用するような場合には、やはり手間の防止や記述ミスを減らすためにユーザー定義関数を作って簡略化すると便利です。

制限

Trim 関数を使用しているので、クリップ情報(縦・横幅、色空間、等々)を変更するフィルターは使用できない。

使用例

Range_f ( filter = "ColorYUV ( gain_y = 50 )", fs = 200, fe = 997, mode = "A" )
// ColorYUV 関数を 200 フレームから、 997 フレームまで使用する。

引数

filter
	使用したいフィルターを記入。
		使用したいフィルターが string 形式     ⇒ """ で左右を囲むこと。
		使用したいフィルターが string 形式以外 ⇒ "   で左右を囲むこと。
fs, fe
	フィルターを掛けたいフレームの指定。
		fs : このフレームよりフィルター適用を開始する。
		fe : このフレームで フィルター適用を終了する。
mode
	フィルター適応方法(適用順番)の指定。
		A     : フィルター > クロップ > 結合
		A以外 : クロップ > フィルター > 結合

関数

Function Range_F ( clip clip, string "filter", int "fs", int "fe", string "mode" ){

	fs   = default ( fs, 0 )
	fe   = default ( fe, 0 )
	mode = default ( mode, "A" )


	Clip_Filter = Eval ( "clip. " + filter )
	Video_mode_A = ( fs == 0 )
	\	? ( fe == 0
	\		? Clip_Filter
	\		: Clip_Filter.Trim(0,fe) ++ clip.Trim(fe+1,0) )
	\	: ( fe == 0
	\		? clip.Trim(0,fs-1)      ++ Clip_Filter.Trim(fs,0 )
	\		: clip.Trim(0,fs-1)      ++ Clip_Filter.Trim(fs,fe) ++ clip.Trim(fe+1,0) )

	Video_mode_B = ( fs == 0 )
	\	? ( fe == 0
	\		? Eval( "clip."                                  + filter                           )
	\		: Eval( "clip.Trim(0,fe  )."                     + filter + " ++ clip.Trim(fe+1,0)" ) )
	\	: ( fe == 0
	\		? Eval( "clip.Trim(0,fs-1) ++ clip.Trim(fs,0 )." + filter                           )
	\		: Eval( "clip.Trim(0,fs-1) ++ clip.Trim(fs,fe)." + filter + " ++ clip.Trim(fe+1,0)" ) )


	mode == "A"
	\	? AudioDubEX ( Video_mode_A, clip )
	\	: AudioDubEX ( Video_mode_B, clip )



	return last

}

更新履歴

20200422
	初公開

コメント

タイトルとURLをコピーしました