『漫游』酷论坛>『影音数码技术学习交流』>[分享]利用ConditionalFilt ..

[分享]利用ConditionalFilter/Reader简化avs分段处理脚本编写

linuxyouxia@2010-11-13 13:29

发现鲜有人交流过这种偷懒技巧[/KH]

似乎很多人是利用trim来完成分段处理的,分段完成后,需要检查帧号,最后合并各段clip
当大量trim存在的情况下 如果某一句的帧号打错了 没检查出来那会很悲剧[/ku]

也有类似于FilterRange之类的avs分段脚本
http://www.avisynth.info/?FilterRange
其本质还是trim 似乎过多的trim分段+滤镜处理 很可能会导致avs脚本载入初始化失败[/KH]

这时就得靠avisynth wiki上提到的一种方法
http://avisynth.org/mediawiki/ConditionalReader#Complicated_ApplyRange
来偷懒

注意这种方法不能适用于调用一些会改变clip帧数的滤镜

脚本开始需要把要调用到的滤镜函数当作字符串赋值给变量
为了方便取名为n1,n2,n3........
例如
复制代码
  1. n1="""ffpp("l5")"""
  2. n2="""daa()"""
  3. n3="""nnedi3()"""


然后需要分段处理的地方要调用到ConditionalFilter/Reader+ScriptClip+Eval
复制代码
  1. ConditionalFilter(last.ScriptClip("""Eval(Eval("n"+string(filterindex)))"""),last, "filterindex", "greaterthan", "0", false)
  2. ConditionalReader("xxxxx.txt", "filterindex")


xxxxx.txt类似以下语法
复制代码
  1. Type int
  2. Default 0
  3. R 0 20 1
  4. R 21 39 2
  5. R 244 266 3
  6. 3168 1
  7. 4652 2
  8. 5043 3

表示
默认情况下filterindex为0,即不处理
0-20帧filterindex为1,即调用ffpp("l5")处理
21-39帧filterindex为2,即调用daa()处理
244-266帧filterindex为3,即调用nnedi3()处理
3168单帧filterindex为1,即调用ffpp("l5")处理
4652单帧filterindex为2,即调用daa()处理
5043单帧filterindex为3,即调用nnedi3()处理


从而ConditionalReader可以从xxxxx.txt读取分段信息 赋值给filterindex
然后ConditionalFilter会检查filterindex 决定返回哪一个clip

当filterindex大于0时 返回last.ScriptClip("""Eval(Eval("n"+string(filterindex)))""")
此时ScriptClip+Eval函数 会根据之前字符串变量 替换("n"+string(filterindex))字符串,并将其当做脚本的一部分来处理 从而实现对函数的调用

以上为偷懒的全过程 小弟表达能力不好 各位大大多包涵:)


题外话:

为了能够更偷懒,小弟还编写了一个小程序

实现一边通过VirtualDub预览 一边按快捷键 便能完成分段 并生成脚本

由于是写给自己用的 程序不完善的地方有很多 再加上本人懒

所以各位大大还是不要期待比较好

http://u.115.com/file/f1b2b14865
MyVDIVTC101010.7z

简单讲解:
程序需要获取VirtualDub的Window Handle才能运作
一种方法是在程序运行初始化时会自动查找类名为VirtualDub的窗口
另一种方法是将焦点放在VD Window Handle下面的输入框里面 将鼠标指针移动到VirtualDub窗口标题上 按下回车键

然后将*.dga/*.d2v/*.*文件拖放到程序窗口里面 文件会被当作Source并在生成脚本时替换脚本编辑窗里面的 %source% 字符串

此时按下Initialize 初始化生成avs脚本 然后拖入VirtualDub预览

选中StayOnTop可以前端显示 选中HotKey可以调用快捷键 能使用快捷键的按钮后面有对应快捷键字符 全在小键盘区

其余就得各位大大自行研究或者看源代码了
引用

264768502@2010-11-13 13:43

可以试试这个系列脚本
http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=8
引用

linuxyouxia@2010-11-13 13:45

引用
最初由 264768502 发布
可以试试这个系列脚本
http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=8

本质还是trim 然后合并[/KH]

以前俺试过用filterrange编写特别复杂的分段 结果avs无法载入:(

[del]FilterRange之类的脚本会调用FrameCount函数 用多了的话。。。。[/del]

修正:看了下avisynth源代码
复制代码
  1. AVSValue FrameCount(AVSValue args, void*, IScriptEnvironment* env) { return VI(args[0]).num_frames; }

得到FrameCount之后FilterRange脚本会做一些数学运算

final_frame = clip.FrameCount() - 1
clip.trim(0, start - 1)
c + clip.trim(end + 1, 0)

计算出trim的帧号

复制代码
  1. class Trim : public GenericVideoFilter
  2. {
  3. public:
  4. Trim(int _firstframe, int _lastframe, bool _padaudio, PClip _child, IScriptEnvironment* env);
  5. PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env);
  6. void __stdcall GetAudio(void* buf, __int64 start, __int64 count, IScriptEnvironment* env);
  7. bool __stdcall GetParity(int n);
  8. static AVSValue __cdecl Create(AVSValue args, void*, IScriptEnvironment* env);
  9. private:
  10. int firstframe;
  11. __int64 audio_offset;
  12. }

对于每一个trim avisynth都会创建一个对象 trim越多资源占用越多[/KH]

trim+蛋疼滤镜分段处理 avs脚本初始化时很容易失败 [/ku]
引用

264768502@2010-11-13 13:55

=.= 会么,我trim50段也没啥问题
ConditionalFilter的方式资源占用的确比trim好...trim一多再加上蛋疼滤镜,很容易崩
引用

linuxyouxia@2010-11-13 13:58

引用
最初由 264768502 发布
=.= 会么,我trim50段也没啥问题

trim然后加上TempGaussMC之类的吃内存的脚本函数调用[/KH]

然后一个脚本全是trim分段 改起来很不方便 比如要加一段 减一段[/ku]

还是贴一下一年半之前 蛋疼人肉写的AVS脚本 花了俺好几个小时
复制代码
  1. filterrange(3422,3422,"""daa()""")
  2. filterrange(3426,3426,"""daa()""")
  3. filterrange(3430,3430,"""daa()""")
  4. filterrange(3434,3434,"""daa()""")
  5. filterrange(3438,3438,"""daa()""")
  6. filterrange(3442,3442,"""daa()""")
  7. filterrange(3446,3446,"""daa()""")
  8. filterrange(4998,4998,"""ffpp("l5")""")
  9. filterrange(5002,5002,"""ffpp("l5")""")
  10. filterrange(5006,5006,"""ffpp("l5")""")
  11. filterrange(5014,5014,"""ffpp("l5")""")
  12. filterrange(5010,5010,"""ffpp("l5")""")
  13. filterrange(6742,6742,"""daa()""")
  14. filterrange(14490,14490,"""daa()""")
  15. filterrange(20874,20874,"""daa()""")
  16. filterrange(26614,26614,"""daa()""")
  17. filterrange(26618,26618,"""daa()""")
  18. filterrange(26622,26622,"""daa()""")
  19. filterrange(26626,26626,"""daa()""")
  20. filterrange(26630,26630,"""daa()""")
  21. filterrange(26634,26634,"""daa()""")
  22. filterrange(30110,30110,"""daa()""")
  23. filterrange(30126,30126,"""daa()""")
  24. filterrange(30130,30130,"""daa()""")
  25. filterrange(30134,30134,"""daa()""")
  26. filterrange(30136,30136,"""daa()""")
  27. filterrange(40458,40458,"""daa()""")
  28. filterrange(40462,40462,"""daa()""")
  29. filterrange(40466,40466,"""daa()""")
  30. filterrange(40470,40470,"""daa()""")
  31. filterrange(40474,40474,"""daa()""")
  32. filterrange(47338,47338,"""daa()""")
  33. filterrange(47342,47342,"""daa()""")
  34. filterrange(47346,47346,"""daa()""")
  35. filterrange(47350,47350,"""daa()""")
  36. filterrange(47354,47354,"""daa()""")
  37. filterrange(47358,47358,"""daa()""")
  38. filterrange(48994,48994,"""MCBOB().selecteven()""")
  39. filterrange(51674,51674,"""maa()""")
  40. filterrange(51678,51678,"""maa()""")
  41. filterrange(51682,51682,"""maa()""")
  42. filterrange(51686,51686,"""maa()""")
  43. filterrange(51690,51690,"""maa()""")
  44. filterrange(51694,51694,"""maa()""")
  45. filterrange(55630,55630,"""daa()""")
  46. filterrange(58546,58546,"""maa()""")
  47. filterrange(65046,65046,"""MCBOB().selecteven()""")
  48. filterrange(65050,65050,"""MCBOB().selecteven()""")
  49. filterrange(65054,65054,"""MCBOB().selecteven()""")
  50. filterrange(65058,65058,"""MCBOB().selecteven()""")
  51. filterrange(65062,65062,"""MCBOB().selecteven()""")
  52. filterrange(65066,65066,"""MCBOB().selecteven()""")
  53. filterrange(86230,86230,"""MCBOB().selecteven()""")
  54. filterrange(86234,86234,"""MCBOB().selecteven()""")
  55. filterrange(86238,86238,"""MCBOB().selecteven()""")
  56. filterrange(86242,86242,"""MCBOB().selecteven()""")
  57. filterrange(86246,86246,"""MCBOB().selecteven()""")
  58. filterrange(86250,86250,"""MCBOB().selecteven()""")
  59. filterrange(89554,89554,"""maa()""")
  60. filterrange(92182,92182,"""MCBOB().selecteven()""")
  61. filterrange(96330,96330,"""daa()""")
  62. filterrange(96334,96334,"""daa()""")
  63. filterrange(96338,96338,"""daa()""")
  64. filterrange(96342,96342,"""daa()""")
  65. filterrange(96346,96346,"""daa()""")
  66. filterrange(96350,96350,"""daa()""")
  67. filterrange(96358,96358,"""nnedi()""")
  68. filterrange(96362,96362,"""nnedi()""")
  69. filterrange(96366,96366,"""nnedi()""")
  70. filterrange(96370,96370,"""nnedi()""")
  71. filterrange(96374,96374,"""nnedi()""")
  72. filterrange(96378,96378,"""nnedi()""")
  73. filterrange(102254,102254,"""MCBOB().selecteven()""")
  74. filterrange(102258,102258,"""MCBOB().selecteven()""")
  75. filterrange(102262,102262,"""MCBOB().selecteven()""")
  76. filterrange(102266,102266,"""MCBOB().selecteven()""")
  77. filterrange(102270,102270,"""MCBOB().selecteven()""")
  78. filterrange(102274,102274,"""MCBOB().selecteven()""")
  79. filterrange(102278,102278,"""MCBOB().selecteven()""")
  80. filterrange(102282,102282,"""MCBOB().selecteven()""")
  81. filterrange(102286,102286,"""MCBOB().selecteven()""")
  82. filterrange(102290,102290,"""MCBOB().selecteven()""")
  83. filterrange(102294,102294,"""MCBOB().selecteven()""")
  84. filterrange(102298,102298,"""MCBOB().selecteven()""")
  85. filterrange(107918,107918,"""daa()""")
  86. filterrange(107922,107922,"""daa()""")
  87. filterrange(107926,107926,"""daa()""")
  88. filterrange(107930,107930,"""daa()""")
  89. filterrange(107934,107934,"""daa()""")
  90. filterrange(107938,107938,"""daa()""")
  91. filterrange(108711,108711,"""maa()""")
  92. filterrange(108730,108730,"""maa()""")
  93. filterrange(113086,113086,"""daa()""")
  94. filterrange(113090,113090,"""daa()""")
  95. filterrange(113094,113094,"""daa()""")
  96. filterrange(113098,113098,"""daa()""")
  97. filterrange(113102,113102,"""daa()""")
  98. filterrange(113106,113106,"""daa()""")
  99. filterrange(113110,113110,"""MCBOB().selecteven()""")
  100. filterrange(114522,114522,"""daa()""")
  101. filterrange(114546,114546,"""daa()""")
  102. filterrange(114550,114550,"""daa()""")
  103. filterrange(114554,114554,"""daa()""")
  104. filterrange(114558,114558,"""daa()""")
  105. filterrange(114562,114562,"""daa()""")
  106. filterrange(114566,114566,"""daa()""")
  107. filterrange(114570,114570,"""daa()""")
  108. filterrange(119630,119630,"""daa()""")
  109. filterrange(119634,119634,"""daa()""")
  110. filterrange(119758,119758,"""MCBOB().selecteven()""")
  111. filterrange(119762,119762,"""MCBOB().selecteven()""")
  112. filterrange(119766,119766,"""MCBOB().selecteven()""")
  113. filterrange(123452,123452,"""daa()""")
  114. filterrange(123457,123457,"""daa()""")
  115. filterrange(123463,123463,"""daa()""")
  116. filterrange(123474,123474,"""daa()""")
  117. filterrange(123485,123485,"""daa()""")
  118. filterrange(123490,123490,"""daa()""")
  119. filterrange(123492,123492,"""daa()""")
  120. filterrange(123495,123495,"""daa()""")
  121. filterrange(123507,123507,"""daa()""")
  122. filterrange(123509,123511,"""daa()""")
  123. filterrange(123513,123513,"""daa()""")
  124. filterrange(123516,123516,"""daa()""")
  125. filterrange(123606,123606,"""daa()""")
  126. filterrange(146759,146759,"""maa()""")

预览时直接崩了

最后是把脚本分段 一段段压出来 然后合并
引用

Yuricon@2010-11-13 21:47

复制代码
  1. a=DGMultiSource("R:\temp\tokiwo_kakeru_syoujyo\00002.dgi")
  2. b=DGMultiSource("R:\temp\tokiwo_kakeru_syoujyo\00002.dgi",deinterlace=1,use_pf=true)
  3. c=a.clipslice(1415,1417,l=190,t=424,r=524,b=42,sp1="nnedi3")
  4. clipslice(a,0,794,cp="nnedi3")
  5. clipslice(795,944,l=70,t=228,r=276,b=228,sp2="nnedi3",clip2=b)
  6. clipslice(795,944,l=74,t=256,r=264,b=204,clip2=b)
  7. clipslice(945,1412,cp="nnedi3")
  8. clipslice(1413,1417,l=68,t=370,r=594,b=82,sp2="nnedi3",clip2=a)
  9. clipslice(1413,1417,l=68,t=402,r=574,b=42,clip2=a)
  10. clipslice(1413,1417,l=158,t=402,r=524,b=42,clip2=c)
  11. clipslice(1418,1672,l=68,t=370,r=594,b=82,sp2="nnedi3",clip2=b)
  12. clipslice(1418,1672,l=68,t=402,r=574,b=42,clip2=b)
  13. clipslice(1418,1672,l=158,t=402,r=524,b=42,clip2=b)
  14. clipslice(1638,1638,l=68,t=370,r=594,b=82,clip2=a)
  15. clipslice(1673,3301,cp="nnedi3")
  16. clipslice(3302,3307,l=68,t=370,r=540,b=84,sp2="nnedi3",clip2=a)
  17. clipslice(3302,3307,l=68,t=402,r=612,b=42,clip2=a)
  18. clipslice(3302,3307,l=120,t=402,r=484,b=42,sp1="Vinverse",spmode=1,clip2=a)
  19. clipslice(3308,3561,l=68,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  20. clipslice(3308,3561,l=68,t=402,r=612,b=42,clip2=b)
  21. clipslice(3308,3561,l=120,t=402,r=484,b=42,clip2=b)
  22. clipslice(3562,4431,cp="nnedi3")
  23. clipslice(4432,4691,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  24. clipslice(4432,4691,l=68,t=404,r=610,b=42,clip2=b)
  25. clipslice(4432,4691,l=120,t=402,r=484,b=44,clip2=b)
  26. clipslice(4692,6489,cp="nnedi3")
  27. clipslice(6490,6749,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  28. clipslice(6490,6749,l=70,t=404,r=574,b=42,clip2=b)
  29. clipslice(6490,6749,l=158,t=402,r=484,b=42,clip2=b)
  30. clipslice(6750,7571,cp="nnedi3")
  31. clipslice(7572,7831,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  32. clipslice(7572,7831,l=70,t=402,r=572,b=42,clip2=b)
  33. clipslice(7572,7831,l=158,t=402,r=484,b=42,clip2=b)
  34. clipslice(7832,9235,cp="nnedi3")
  35. clipslice(9236,9495,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  36. clipslice(9236,9495,l=70,t=402,r=572,b=42,clip2=b)
  37. clipslice(9236,9495,l=158,t=402,r=490,b=42,clip2=b)
  38. clipslice(9496,10340,cp="nnedi3")
  39. clipslice(10341,10600,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  40. clipslice(10341,10600,l=70,t=402,r=574,b=42,clip2=b)
  41. clipslice(10341,10600,l=158,t=402,r=484,b=42,clip2=b)
  42. clipslice(10601,11605,cp="nnedi3")
  43. clipslice(11606,11865,l=70,t=370,r=540,b=84,sp2="nnedi3",clip2=b)
  44. clipslice(11606,11865,l=70,t=402,r=574,b=42,clip2=b)
  45. clipslice(11606,11865,l=156,t=402,r=484,b=42,clip2=b)
  46. clipslice(11866,13171,cp="nnedi3")
  47. clipslice(13172,13431,l=70,t=348,r=576,b=108,sp2="nnedi3",clip2=b)
  48. clipslice(13172,13431,l=154,t=348,r=422,b=110,clip2=b)
  49. clipslice(13172,13431,l=70,t=374,r=576,b=82,clip2=b)
  50. clipslice(13172,13431,l=154,t=376,r=374,b=82,clip2=b)
  51. clipslice(13172,13431,l=70,t=402,r=612,b=42,clip2=b)
  52. clipslice(13172,13431,l=120,t=402,r=524,b=42,clip2=b)
  53. clipslice(13432,14059,cp="nnedi3")
  54. clipslice(14060,14319,l=70,t=370,r=596,b=84,sp2="nnedi3",clip2=b)
  55. clipslice(14060,14319,l=70,t=402,r=574,b=42,clip2=b)
  56. clipslice(14060,14319,l=156,t=402,r=484,b=42,clip2=b)
  57. clipslice(14320,15638,cp="nnedi3")
  58. clipslice(15639,23913,l=0,t=408,r=0,b=40,sp2="nnedi3",clip2=b)
  59. clipslice(23914,24715,cp="nnedi3")
  60. crop(4,0,-4,0)

很坚挺的,不光clip还包含slice+DGNV替换
你那种事我也做过,用的fft3dgpu GradFun2DBmod SharpAAMCmod eedi2 nnedi2,外加三重slice*N,结果50+行就爆了,虽然那时候用的是clipslice3这种蛋疼玩意,早期的一个专门对付某片的版本,代码比现在来说是完全没优化的,现在优化后情况好很多,起码一般50次依然不会爆,而且现在实际应用上加上一些技巧能少写很多行
引用

linuxyouxia@2010-11-13 22:23

不知道clipslice分段100段 avs脚本初始化过程中parse过程要多久
如果每次脚本parse过程太久的话 每次添加新的函数调用后 想要重新预览的一下会等很久的

之前使用FilterRange/EasyVFR之类的脚本 分段一多每次预览都要等好久 使用ConditionalFilter/Reader以后用VD重新预览速度很快

其实除了avisynth本身的问题外 主要是使用ConditionalFilter/Reader简化了脚本书写量

之前用FilterRange每一个分段都要敲一次FilterRange函数 和 需要调用的函数 现在配合自行编写的程序直接敲快捷键就行了 当然以前也写过生成FilterRange/EasyVFR脚本的程序

如果不满意分段 ConditionalReader读取外部文件时 后面行的指定会覆盖前面行的指定

比如原来你100-200段用filter1处理 现在要改成100-120用filter1处理 121-200用filter2处理
使用FilterRange之类的脚本的脚本 需要改一处帧号 然后再重新添加一行
ConditionalReader的话 直接在要读取的文件最后加一行就行了

嘛 分段过少的情况下 俺也会选择用FilterRange之类的脚本
分段太多 坚决用ConditionalFilter/Reader

说点题外话 为啥俺喜欢用VirtualDub预览avs 因为VFRHelper、AVSPMod之类的程序需要先将非rgb32图像数据 转成rgb32图像数据 然后再输出显示
而VirtualDub可以调用DirectX来显示 并且它有个很方便的功能GoToNextScene 而且可以调节Video Buffering
引用

Yuricon@2010-11-13 22:51

其实预览问题....写相关部分的处理时我习惯注释掉其他不相关的行,这样预览速度就不会存在太大问题
编码的时候除了开始载入时速度会比较慢,整体编码速度还算是很不错的
其实我知道用别的写效率绝对高很多,但我的脚本整个系列是完全基于avs本身的函数,所以设计理念上限制是很大的
clipslice的重点不光光是clip,还有slice上的处理,以及很多基于clip和slice的处理,应用上来说灵活度已经很高了
目前来说还算坚挺,足够个人ep了,我用avspmod,其实也就是写脚本图个方便罢了,比起VD,还是喜欢avspmod
引用

linuxyouxia@2010-11-13 22:52

嘛 俺的方法也是基于avs本身的函数
引用

Yuricon@2010-11-13 22:55

其实说到底...avs本身优化做好了就不存在这类问题了....
引用

linuxyouxia@2010-11-13 22:59

实现同样的目的 算法思路不同 效率还是有差别的[/KH]
引用

Yuricon@2010-11-13 23:07

引用
功能

ClipSlice是一个结合了Clip+Slice双重功能的脚本。

在Clip上,类似于ApplyRange,使用外部或者内部的脚本滤镜对clip的指定帧段或帧进行处理,但ClipSlice更加灵活易用。与ClipSlice的Clip部分同类型的脚本还有AAD中的函数AADTrim,AADTrim也是一个非常优秀的脚本。

在Slice上,功能与slicedecomb2大致相同,对选择的段落进行画中画切片使用外部或者内部的脚本滤镜分开进行处理,只不过使用习惯上更偏向于作者个人的喜好。

总的来说,ClipSlice是一个基于时间轴与2D平面处理的AviSynth脚本。

现在的ClipSlice已经包含了RRE的功能,可以进行帧段替换与帧段切片替换。

在段落帧率改变的情况下能够自动同步帧率,还有方便VFR制作的TimeCode书写辅助的功能。

ClipSlice到底能发挥多大的能力,一切尽在您的掌握。


我觉得靠ConditionalFilter要实现这一系列功能还是很有难度的...
引用

linuxyouxia@2010-11-13 23:19

俺觉得没必要用ConditonalFilter来实现这系列功能 需要实现的话 还是需要调用自行编写的脚本

大大的脚本确实好 功能也很强大 俺也很佩服

不过实现同一个目的也有很多方法嘛 俺喜欢根据具体情况来选择:D

睡觉去了 原本发这帖也只是交流一个偷懒技巧
引用

Yuricon@2010-11-13 23:22

是啊...我也更愿意选择更好的方法,不过要考虑很多方面的话只能选择更合适的方法,然后尽可能的完成后对其进行优化
其实开始谁都想偷懒,不过后来才发现,这是个EP的无底洞...后来只会越来越EP
引用

linuxyouxia@2010-11-13 23:25

突然发现大大把注册后最开始5帖都用来和小弟交流了 真是荣幸

以后有机会多交流吧:)
引用

«123»共3页

| TOP