linuxyouxia |
2011-11-12 00:34 |
[分享]MyFilterRange:对ConditionalReader/Filer分段方法的改进
懒人一个,将至少半年前的想法简单实现了一下 写了一个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/ConditionalReader http://avisynth.org/mediawiki/ScriptClip#FrameEvaluate 另: 纯手工写ConditionalReader分段脚本效率比较低下,并且容易出错,推荐使用工具自动生成 可以考虑利用AvsPMod的书签+自定义宏生成 或者 自行编写程序(比如我写的MyVDIVTC配合VirtualDub,或者等我把MyAvsPreview写完)
|
|