『漫游』酷论坛>『影音数码技术学习交流』>[分享]MyFilterRange:对Co ..

[分享]MyFilterRange:对ConditionalReader/Filer分段方法的改进

linuxyouxia@2011-11-12 00:34

懒人一个,将至少半年前的想法简单实现了一下

写了一个MyFilterRange avisynth插件,配合FrameEvaluate和ConditionalReader使用
(其实代码稍加修改,便无需FrameEvaluate)
插件使用Avisynth C interface,故请用LoadCPlugin载入

源代码及dll:
http://dl.dbank.com/c0thhdry5n

调用参数:
复制代码
  1. MyFR(clip, String Var("_MyFilterStr_"), String Debug("") )


原理:
复制代码
  1. 如果使用ScriptClip,每次对其GetFrame时都会重新载入一遍滤镜,速度比较慢
  2. 如果采用初始化时载入所有需要用到的滤镜的方法,又会占用不必要的内存资源
  3. MyFR每次GetFrame时,获取Var变量所表示的字符串
  4.     如果Var为"_none",则返回源第n帧
  5.     如果Var不为"_none"
  6.       如果Var发生改变,释放之前载入的滤镜,调用Eval,载入新滤镜,并将得到的Clip保存,返回经滤镜处理后的第n帧
  7.       如果Var不发生改变,无需重新载入滤镜,直接返回之前得到的Clip第n帧
  8.     如果载入滤镜过程发生异常,则返回源第n帧,并将错误信息写入Debug文件


使用示例:
test.avs
复制代码
  1. #申明需要用到的滤镜及编号,注意别忘了"_none"
  2. n0="""_none"""
  3. n1="""Filter1()"""
  4. n2="""Filter2()"""
  5. #载入MyFilterRange滤镜,注意使用LoadCPlugin
  6. LoadCPlugin("MyFilterRange.dll")
  7. filterR="test.FilterR"
  8. xxxSource()
  9. #指定从filterstr变量读取滤镜信息,输出log至MyFR.log
  10. MyFR("filterstr","MyFR.log")
  11. #从test.FilterR文件中读取分段信息,并将其滤镜信息赋值给filterstr变量
  12. FrameEvaluate("""filterstr = Eval("n"+string(filterindex))""")
  13. ConditionalReader(filterR, "filterindex")


test.FilterR
复制代码
  1. Default 0
  2. R 0 10 1
  3. 99 2

表示默认不处理,第0-10帧用Filter1()处理,第99帧用Filter2()处理

具体参考:
http://avisynth.org/mediawiki/ConditionalReader
http://avisynth.org/mediawiki/ScriptClip#FrameEvaluate

另:
纯手工写ConditionalReader分段脚本效率比较低下,并且容易出错,推荐使用工具自动生成
可以考虑利用AvsPMod的书签+自定义宏生成 或者 自行编写程序(比如我写的MyVDIVTC配合VirtualDub,或者等我把MyAvsPreview写完)
引用

06_taro@2011-11-12 02:47

坐收神器~
2G的內存限制太無奈了……
引用

roozhou@2011-11-12 14:44

如果滤镜需要lookahead或lookback怎么处理?
引用

| TOP