搜索 社区服务 统计排行 帮助
  • 3548阅读
  • 2回复

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

楼层直达
级别: 圣骑士
注册时间:
2006-08-17
在线时间:
146小时
发帖:
215
懒人一个,将至少半年前的想法简单实现了一下

写了一个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写完)

Fansubbing is a waste of time.
级别: 骑士
注册时间:
2008-10-06
在线时间:
115小时
发帖:
319
只看该作者 1楼 发表于: 2011-11-12
坐收神器~
2G的內存限制太無奈了……

Follow me: @06_taro

MediaFire links to:
Taro's tools (avs plugins & other useful tools' builds)
Taro's x264 builds (Latest build: x264 core:129 r2245+704_tMod (&tMod+10bit/MixAQ/OreAQ), Win & MacOS, built on 10 Jan 2012, gcc: 4.7.2)

nmm牆內鏡像(部分工具)
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 2楼 发表于: 2011-11-12
如果滤镜需要lookahead或lookback怎么处理?
快速回复

限150 字节
上一个 下一个