查看完整版本: [-- [分享]MyFilterRange:对ConditionalReader/Filer分段方法的改进 --]

『漫游』酷论坛 -> 『影音数码技术学习交流』 -> [分享]MyFilterRange:对ConditionalReader/Filer分段方法的改进 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

linuxyouxia 2011-11-12 00:34

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

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

写了一个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时都会重新载入一遍滤镜,速度比较慢
    如果采用初始化时载入所有需要用到的滤镜的方法,又会占用不必要的内存资源

    MyFR每次GetFrame时,获取Var变量所表示的字符串
        如果Var为"_none",则返回源第n帧

        如果Var不为"_none"
          如果Var发生改变,释放之前载入的滤镜,调用Eval,载入新滤镜,并将得到的Clip保存,返回经滤镜处理后的第n帧

          如果Var不发生改变,无需重新载入滤镜,直接返回之前得到的Clip第n帧

        如果载入滤镜过程发生异常,则返回源第n帧,并将错误信息写入Debug文件


使用示例:
test.avs
  1. #申明需要用到的滤镜及编号,注意别忘了"_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
  1. Default 0
    R 0 10 1
    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怎么处理?


查看完整版本: [-- [分享]MyFilterRange:对ConditionalReader/Filer分段方法的改进 --] [-- top --]


Powered by phpwind v8.5 Code ©2003-2011 phpwind
Time 0.008730 second(s),query:3 Gzip disabled