HowToApplyFilterToManySingleFrames

[このスレッド]にインスパイアされて。

私たちの任務

私たちは、多数のフレームに、フィルタを適用しなければなりません。しかし、大きなスクリプトを作成するのは長たらしくて退屈で、AviSynth に大いにストレスをかけます。

私たちの解決策

私たちは、条件フィルタ(conditional filter)を使って、外部ファイルからフレーム番号を読み込みます。

スクリプト

私たちは、指定されたフレームに、前のフレームの色差を使いたいと思います。

global FreezeThis = 0               # これを変更しないで - それは何もしません。
video = AviSource("video.avi")
frozen = video.MergeChroma(DuplicateFrame(video,0))
ConditionalFilter(video, frozen, video, "FreezeThis", "==", "1")
ConditionalReader("BadFrames.txt", "FreezeThis", false)

さて、ずいぶん簡単そうに見えます。こちらに、私たちが行っていることがあります。私たちは、オリジナルのビデオストリームと代替のビデオストリームを作成します。ここで私たちは、単純に、最初のフレームを複製します。このようにして、1フレームずつそれを差し引き計算(offset)して*1、オリジナルのビデオに色差をマージします。それから、私たちは、もしそれが選択されている場合は代替ストリームからフレームを選択する、条件フィルタを作成します。しかし、私たちは、まだどのフレームも指定していません。私たちは、"Badframes.txt"と呼ばれる外部ファイルの中で、それを行います。

外部ファイル

これは、ConditionalReader用の、かなり基本的なファイルです。それは、このようになるべきです:

Badframes.txt:

type int
default 0
65 1
324 1
451 1
871 1

基本的に、それは "デフォルト(default)として、値を 0 に設定する" ということを言っています。私が指定するフレームに関しては、それを 1 に設定してください。

上級編

OK。参照されたオリジナルのスレッドでは、色差は、時には他のフレームから取ることもできました。そこで、各フレームのオフセットを指定することができるフィルタを作るというのはどうでしょう。これは、もう少しトリッキーです:

global FreezeThis = 0                                   # これを変更しないで - それは何もしません。
global video = AviSource("video.avi")
past = ScriptClip("trim(video,-FreezeThis,0)")
future = ScriptClip("blankclip(video, length=FreezeThis)+video")
offset = video.MergeChroma(Conditionalfilter(video, past, future, "FreezeThis", "<", "0"));
ConditionalFilter(video, video, offset, "FreezeThis", "==", "0")
ConditionalReader("BadFrames.txt", "FreezeThis", false)

Badframes.txt:

type int
default 0
65 5
324 -10
451 2
871 4

今、私たちは、1フレームベースで、選択可能なフレーム番号によって、色差を相殺することができるスクリプトを持っています!


註: このページは、HowToApplyFilterToManySingleFrames - AviSynthの日本語訳です。


*1 訳者註: 先頭フレームをDuplicateFrameで複製し、先頭に1フレーム追加することによって、frozenのフレームを1フレームずつずらしています。

最終更新日時: 2014-03-12 (水) 23:39:30 (3695d)