懒人一个,将至少半年前的想法简单实现了一下
写了一个MyFilterRange avisynth插件,配合FrameEvaluate和ConditionalReader使用
(其实代码稍加修改,便无需FrameEvaluate)
插件使用Avisynth C interface,故请用LoadCPlugin载入
源代码及dll:
http://dl.dbank.com/c0thhdry5n 调用参数:
- MyFR(clip, String Var("_MyFilterStr_"), String Debug("") )
原理:
- 如果使用ScriptClip,每次对其GetFrame时都会重新载入一遍滤镜,速度比较慢
- 如果采用初始化时载入所有需要用到的滤镜的方法,又会占用不必要的内存资源
- MyFR每次GetFrame时,获取Var变量所表示的字符串
- 如果Var为"_none",则返回源第n帧
- 如果Var不为"_none"
- 如果Var发生改变,释放之前载入的滤镜,调用Eval,载入新滤镜,并将得到的Clip保存,返回经滤镜处理后的第n帧
- 如果Var不发生改变,无需重新载入滤镜,直接返回之前得到的Clip第n帧
- 如果载入滤镜过程发生异常,则返回源第n帧,并将错误信息写入Debug文件
使用示例:
test.avs
- #申明需要用到的滤镜及编号,注意别忘了"_none"
- n0="""_none"""
- n1="""Filter1()"""
- n2="""Filter2()"""
- #载入MyFilterRange滤镜,注意使用LoadCPlugin
- LoadCPlugin("MyFilterRange.dll")
- filterR="test.FilterR"
- xxxSource()
- #指定从filterstr变量读取滤镜信息,输出log至MyFR.log
- MyFR("filterstr","MyFR.log")
- #从test.FilterR文件中读取分段信息,并将其滤镜信息赋值给filterstr变量
- FrameEvaluate("""filterstr = Eval("n"+string(filterindex))""")
- ConditionalReader(filterR, "filterindex")
test.FilterR
表示默认不处理,第0-10帧用Filter1()处理,第99帧用Filter2()处理
具体参考:
http://avisynth.org/mediawiki/ConditionalReaderhttp://avisynth.org/mediawiki/ScriptClip#FrameEvaluate 另:
纯手工写ConditionalReader分段脚本效率比较低下,并且容易出错,推荐使用工具自动生成
可以考虑利用AvsPMod的书签+自定义宏生成 或者 自行编写程序(比如我写的MyVDIVTC配合VirtualDub,或者等我把MyAvsPreview写完)