ClipSlice

来自NMM Doc
跳到导航 跳到搜索

ClipSlice是一个用于对clip的指定帧段或帧,使用外部或者内部脚本滤镜进行局部处理的AviSynth脚本

作者:桜ノ雨(Yuricon)

起源

ClipSlice正如其名,分为Clip和Slice。当初为了处理一个某些片段为画中画,并且画中画交错,画中画外不交错的片源而头痛。起初想到了ApplyRange+slicedecomb2,但是由于ApplyRange对于参数过多的脚本或者滤镜的使用上会变得非常麻烦,再加上slicedecomb2的各种不顺手,于是边学边用写出了ClipSlice。

终结

我觉得我已经崩溃了。。。已经没有时间与精力再去做任何事了,我能做的只有这些了。。。

我决定停止全部脚本的开发,这可能是暂时性的,也可能是永久性的,如果您有继续开发的意向,请随意

2010年10月20日 by Yuricon

功能

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

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

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

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

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

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

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

更新日志

2011/03/13 ClipSlice Readme

  • 修正了说明文档中cspmode(0 1)以及RREmode(2 3)的描述与实际功能相反的错误(感谢Holy)

2010/12/06 EPClip EPSlice v 1.50 beta

  • 修改了架构,使用ClipSlice的模块函数,与ClipSlice同步
  • 修正了若干BUG
  • 增加了EPClip自动同步帧率功能
  • (临时更新)

2010/12/06 ClipSlice v 1.50 beta

  • 修改了整体架构,完全模块化
  • 修改了RREmode参数
  • 修正了若干BUG,主要在于架构偷懒引起的Slice替换功能cs ce设置无效问题
  • 增加了debug=6模式,可以直接输出TC,适用于只需要改变1段或3连段帧率的情况
  • 增加了"fps" "Denominator"参数,用于设定同步帧率fps/Denominator
  • (临时更新)

2010/10/20 Final

  • ClipSlice ClipSlice_old ClipSlice_debug以及其他脚本全部停止开发

2010/10/13 ClipSlice_old v 0.56 beta

  • 修正了一处BUG,同ClipSlice

2010/10/13 ClipSlice v 1.21 beta

  • 修正了一处BUG,在ep1改变帧数的情况下,debug=5的开始帧会错误,原因在于这个值是直接引用的参数s,现在改为通过ep1计算

2010/10/09 ClipSlice_old v 0.55 beta(未正式发布)

  • 增加了"debug"的新模式,debug=5,TC书写辅助模式,同ClipSlice
  • 增加了TC书写辅助参数,"TCHOut","append"
  • 修改了自动同步帧率的功能,自动同步到原始clip的帧率

2010/10/08 ClipSlice v 1.20 beta

  • 修正了两处隐患BUG,一处同2010/09/01的修正,一处则是epmode=1下,ep2无效的问题(手滑)
  • 增加了"debug"的新模式,debug=5,TC书写辅助模式,此为ClipSlice独有参数值
  • 增加了TC书写辅助参数,"TCHOut","append"
  • 增加了自动同步帧率的功能,自动同步到原始clip的帧率

2010/09/01 ClipSlice_old v 0.51 beta

  • 修正了一处隐患BUG,解决了EP1即使帧数大于1也不能用tdecimate等必须帧数大于1的滤镜和脚本的问题,但如果是实际上帧数不能满足某些滤镜脚本的使用条件的话还是无法使用

2010/08/24 ClipSlice_old v 0.50 beta

  • 修改了ClipSlice旧版的函数名,改为ClipSlice_old
  • 修改了合并判断机制,现在使用新版的判断机制,解决了总帧数必须>=3的缺陷
  • 更新了内置的ClipSlice_debug的版本到0.50
  • 增加了自动同步帧率的功能,自动同步到处理后的cp段帧率
  • 增加了一些错误提示 (感谢Google Translate服务的英文翻译)

2010/08/04 ClipSlice v 1.10 beta

  • 增加了RRE的功能,并且比RRE更加强大,在帧段替换的基础上还能进行切片替换。
  • 增加了cs ce clip2 RREmode 4个RRE功能相关参数。
  • 增加了若干RRE功能相关的错误提示。 (感谢Google Translate服务的英文翻译)

2010/07/26 ClipSlice v 1.00 beta (这是ClipSlice一个全新的版本)

  • 修改了几乎全部的判断代码,整体结构重建,实现模块化,并且解决了总帧数必须>=3的缺陷。Clip+Slice,Clip部分单独作为一个函数EPClip,Slice部分单独作为一个函数EPSlice,而ClipSlice则是合体版。单独使用其中一种功能时,建议使用独立函数,当然用ClipSlice也可以,可能会比单独函数的要慢一点(理论上)。不过要用Clip+Slice功能时,ClipSlice可能会更快(理论上)。单独的函数也能互相结合使用。
  • 修改了ClipSlice_Debug,并对ClipSlice_Debug相关代码做了调整,详细见MYEPTools中的ClipSlice_Debug更新日志。
  • 增加了color参数,ClipSlice_Debug相关,详细见MYEPTools中的ClipSlice_Debug更新日志。
  • 增加了cpmode epmode spmode cspmode 4个控制先后次序相关参数。
  • 增加了英文错误提示。 (感谢Google Translate服务)

2010/07/09 ClipSlice v 0.41 beta (这是一个未公开发布的版本)

  • 修改了ClipSlice_Debug,并对ClipSlice_Debug相关代码做了调整,详细见MYEPTools中的ClipSlice_Debug更新日志。

2010/06/30 ClipSlice v 0.40 beta

  • 增加了"debug"参数,主要用来调试切片,开启后能更加直观的看到切片范围。debug功能可以单独用函数clipslice_debug调用,参数见下方使用范例。由于Layer的限制,加上写得比较仓促,所以目前只支持YV12 YUY2 RGB32输入。其中YV12输入在开启debug后会进行2次颜色空间转换,因此会产生一些颜色损失,由于只是进行切片调试,所以也没太大影响,关闭debug模式后将不会受到任何影响。

2010/06/20 ClipSlice v 0.31 beta

  • 修改了空参数的默认值,由"nop()"改回"crop(0,0,0,0)"。也许是由于写法上的错误,"nop()"无法正常工作,但还是感谢cunhan的提议。

2010/06/20 ClipSlice v 0.30 beta

  • 增加了"ep1" "ep2"参数,这两个参数主要用来引用外部或内部滤镜脚本对非clip部分进行操作
  • 修改了空参数的默认值,由"crop(0,0,0,0)"改为"nop()"(感谢cunhan)

2010/05/20 ClipSlice v 0.20s beta (特别简化版)

  • 修改了全部代码结构,优化了整体代码,但功能不变
  • 修改了错误提示功能,现在改用MessageClip来实现
  • 修改了部分注释

2010/05/16 ClipSlice v 0.20 beta

  • 增加了"cp"参数,这个参数主要用来引用外部或内部滤镜脚本对clip部分进行操作。增加这个参数主要是为了解决对clip段落进行trim等改变帧数却不改变帧率的操作,对于IVTC这类同时影响帧数帧率的操作暂时不支持
  • 修改了"p1" "p2"参数名,改为"sp1" "sp2",纯属为了以后的扩展性
  • 修改了一些相关注释(感谢真红的英语提示部分翻译)

2010/03/16 ClipSlice v 0.10 beta

  • ClipSlice诞生

参数说明

function ClipSlice(clip clip, 
\ int "s", int "e", string "cp", string "ep1", string "ep2", 
\ int "l", int "t", int "r", int "b", string "sp1", string "sp2", 
\ int "cpmode", int "epmode", int "spmode", int "cspmode", int "RREmode", 
\ int "debug", int "level", int "color", float "fps", float "Denominator", string "TCHOut", bool "append", 
\ int "cs", int "ce", clip "clip2")

function ClipSlice_old(clip clip, 
\ int "s", int "e", string "cp", string "ep1", string "ep2",
\ int "l", int "t", int "r", int "b", string "sp1", string "sp2", 
\ int "debug", int "level", int "color", string "TCHOut", bool "append")

function EPClip(clip clip, int "s", int "e", string "cp", string "ep1", string "ep2", int "cpmode", int "epmode")

function EPSlice(clip clip, int "l", int "t", int "r", int "b", string "sp1", string "sp2", int "spmode")

注意:新版与旧版的相同参数,说明是基本通用的,但是ClipSlice_old的处理过程相当于新版的cpmode=1,epmode=1,spmode=1,cspmode=0,并且没有RRE功能

Clip(EPClip)部分参数

参数 说明 默认设置 类型
s 选取clip段落的开始帧 0 int
e 选取clip段落的结束帧 0 int
特别说明 s必须使用>=0的正整数,s=0表示开始帧是第一帧
e必须使用>=-1的整数,s=0,e=-1表示选取段落为第一帧,e=0表示结束帧是最后一帧
s=0,e=0表示选取段落为全部帧
cp 对选取的clip段落引用外部滤镜或脚本进行处理 无处理 string
ep1 对选取外的clip段落的前一段引用外部滤镜或脚本进行处理 无处理 string
ep2 对选取外的clip段落的后一段引用外部滤镜或脚本进行处理 无处理 string
特别说明 cp ep1 ep2可以使用影响帧数并且不影响帧率的滤镜脚本,比如trim
但不要使用影响到帧率/颜色空间/分辨率等会影响到拼接的滤镜脚本
或者使用后将其帧率/颜色空间/分辨率等还原
cpmode 选择cp应用先后顺序 0 int
特别说明 cpmode=0 在应用cp后再trim
cpmode=1 在trim后再应用cp
epmode 选择ep应用先后顺序 0 int
特别说明 epmode=0 在应用ep后再trim
epmode=1 在trim后再应用ep

Slice(EPSlice)部分参数

参数 说明 默认设置 类型
l 选取左边slice范围,正整数 0 int
t 选取上边slice范围,正整数 0 int
r 选取右边slice范围,正整数 0 int
b 选取下边slice范围,正整数 0 int
特别说明 由于使用EPCrop,所以支持奇数切边
奇数切边有损,并且可能会出现问题,请自行抉择,如果出现问题,请用偶数切边
sp1 对选取的slice范围引用外部滤镜或脚本进行处理 无处理 string
sp2 对选取外的slice范围引用外部滤镜或脚本进行处理 无处理 string
特别说明 请不要使用影响到帧数/帧率/颜色空间/分辨率等会影响到拼接的滤镜脚本
或者使用后将其帧数/帧率/颜色空间/分辨率等还原
spmode 选择sp应用先后顺序 0 int
特别说明 spmode=0 在应用sp1后再crop
spmode=1 在crop后再应用sp1

ClipSlice_RRE相关参数

参数 说明 默认设置 类型
cs 选取clip2段落的开始帧 等于s int
ce 选取clip2段落的结束帧 等于e int
特别说明 cs必须使用>=0的正整数,cs=0表示开始帧是第一帧
ce必须使用>=-1的整数,cs=0,ce=-1表示选取段落为第一帧,ce=0表示结束帧是最后一帧
cs=0,ce=0表示选取段落为全部帧
clip2 第二个片段 等于clip clip
特别说明 如果要用clip的c-d帧段来替换clip的a-b帧段,就不要填clip2,默认即可
RREmode RRE的模式选择 0 int
特别说明 RREmode=0 关闭RRE模式
RREmode=1 帧段替换模式
RREmode=2 帧段+切片替换模式,在slice替换时,选取范围内为clip2,选取范围外为clip
RREmode=3 帧段+切片替换模式,在slice替换时,选取范围内为clip,选取范围外为clip2
RREmode=0下,任何RRE参数将不起作用
RREmode=1下,仅仅进行帧段替换,不会做slice替换,slice功能将正常使用
不能在cspmode=0的情况下使用RRE功能

ClipSlice独有参数

参数 说明 默认设置 类型
ClipSlice only
cspmode 选择cp和sp应用的先后顺序 1 int
特别说明 cspmode=0 在应用sp1 sp2后再应用cp
cspmode=1 在应用cp后再应用sp1 sp2
fps 指定同步帧率(分子),仅在帧率不同步以及debug=6时有效 clip帧率 float
Denominator 指定同步帧率(分母),仅在帧率不同步以及debug=6时有效 clip帧率 float
ClipSlice and ClipSlice_old
debug ClipSlice_Debug模式选择 0 int
特别说明 debug=0 关闭debug
debug=1 选取范围正常显示,选取外半透明层覆盖
debug=2 选取范围半透明层覆盖,选取外正常显示
debug=3 选取范围正常显示,选取外半透明黑层覆盖,并显示提示:当前模式,切边范围,透明度,覆盖层颜色
debug=4 选取范围半透明黑层覆盖,选取外正常显示,并显示提示:当前模式,切边范围,透明度,覆盖层颜色
debug=5 TimeCode书写的辅助模式,会在cp段落画面右上角显示书写TC的相关信息:
当前模式,当前CP部分起始帧,当前CP部分结束帧,当前CP部分帧率,是否输出文件以及输出文件路径
debug=6 TimeCode输出模式,必须指定TCHOut,适用于只有一个ClipSlice改变帧率的情况
关于debug=5的特别说明,当TCHOut未指定时,不输出文件,只有TCHOut指定输出文件后,才会输出TC的相关辅助信息
当前CP部分是指处理过后的指定段落的clip
另外ClipSlice中的debug=5是ClipSlice(包括旧版)独有参数值,ClipSlice_Debug中并没有debug=5
关于debug=6的特别说明,与debug=5类似,同属于ClipSlice独有参数值,不过ClipSlice_old和ClipSlice_debug中目前还没有加入
level ClipSlice_Debug透明度选择,0-255,0完全透明,255完全不透明 200 int
特别说明 在RGB输入下level将无效,覆盖层为完全不透明
color ClipSlice_Debug覆盖层颜色选择,十六进制 $000000 (黑) int
TCHOut TimeCodeHelpOut,指定TC书写辅助信息的输出路径 空(不输出) string
特别说明 仅在debug=5 6下有效,在debug=6下必须指定,而debug=6下输出的是完整的TimeCode文件,记得输出TC后关掉
append TCHOut的追加写入模式 false(不追加写入) bool
特别说明 仅在debug=5下有效

使用范例

DGDecode_mpeg2source("X:\YV12_Clip.d2v")
ClipSlice(s=11,e=22,cp="lsfmod()",ep1="nnedi3()",ep2="nnedi3()",
\         l=24,t=24,r=24,b=24,sp1="nnedi3()",sp2="fft3dgpu()",
\         cpmode=0,epmode=0,spmode=0,cspmode=1,
\         debug=3,level=200,color=$000000)

#对11-22帧进行局部处理,其中截取的范围为左上右下各减24像素后的图像
#截取范围内的图像使用nnedi3处理,截取外的图像使用fft3dgpu处理,2者合并后的图像通过lsfmod处理,参数默认
#对11-22帧以外的段落用nnedi3处理,参数默认
#开启debug,选取范围正常显示,选取外半透明黑层覆盖,并显示提示:当前模式,切边范围,透明度,覆盖层颜色
a=DGMultiSource("R:\00002.dgi")
b=DGMultiSource("R:\00002.dgi",deinterlace=1,use_pf=true)
ClipSlice(795,944,l=70,t=228,r=276,b=228,sp2="nnedi3",spmode=1,rremode=2,clip2=b)

#a和b是同一文件,分别用DGNV的deinterlace=0,和deinterlace=1去加载
#在795-944这一个段落内,范围为l=70,t=228,r=276,b=228
#用b(PV做deint)的同一段落的同一范围去替换,范围外的切片用nnedi3处理
#注:由于EDI系往往在静态30P文字上处理得很糟糕,但30I部分却处理得比PV更出色,
#而PV对于30I背景+30P静态文字,文字上效果非常不错,所以用DGNV的PV去处理静态文字部分,
#用NNEDI3去处理背景部分,效果会很不错
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
ClipSlice(10,20,cs=30,ce=40,rremode=1)
#用30-40帧去替换10-20帧
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
EPClip(11,22,"lsfmod()","nnedi3()","nnedi3()",0,0)
#or
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
EPClip(s=11,e=22,cp="lsfmod()",ep1="nnedi3()",ep2="nnedi3()",cpmode=0,epmode=0)
#对11-22帧用lsfmod进行菊部处理,参数默认,对11-22帧以外的段落用nnedi3处理,参数默认
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
EPSlice(24,24,24,24,"nnedi3()","fft3dgpu()",0)
#or
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
EPSlice(l=24,t=24,r=24,b=24,sp1="nnedi3()",sp2="fft3dgpu()",spmode=0)
#截取的范围为左上右下各减24像素后的图像,截取范围内的图像使用nnedi3处理,截取外的图像使用fft3dgpu处理
#你也可以这样应用
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
EPClip(11,12,"""EPSlice(24,24,24,24,"nnedi3()")""","FFT3DGPU","FFT3DGPU")
#效果等于
DGDecode_mpeg2source("X:\YV12_Clip.d2v")
ClipSlice(11,12,ep1="FFT3DGPU",ep2="FFT3DGPU",l=24,t=24,r=24,b=24,sp1="nnedi3")
#在引用时注意,比如cp="Subtitle("nimei")",这样写是错误的
#要用三重引号,cp="""Subtitle("nimei")""",这样才是正确的
#对于IVTC等特殊处理,你可以这样
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(101,200,cp="AAD",cpmode=1)
#也可以这样
ClipSlice_old(101,200,cp="AAD")
#ClipSlice在处理完各段后会自动同步帧率到原始clip的帧率,这样有助于多ClipSlice下分段做IVTC等操作
#但请不要忘记写TimeCodes

#当然,如果你不满意ClipSlice自动同步的帧率的话,可以这样
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice_old(101,200,cp="AAD")
AssumeFPS(30000,1001)
#也可以这样
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(101,200,cp="AAD",cpmode=1,fps=24000,Denominator=1001)
#觉得TC写起来很麻烦?那么你可以试试ClipSlice(包括old)的新功能
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(s=10,e=20,cp="TDecimate(1)",cpmode=1,debug=5,tchout="X:\temp\tchout.txt")
#or 
ClipSlice_old(s=10,e=20,cp="TDecimate(1)",debug=5,tchout="X:\temp\tchout.txt")

#这样,你选取的段落画面的右上角就会显示出以下提示信息
#################################
#TimeCode书写辅助模式:
#当前CP部分总帧数:8
#当前CP部分起始帧:10
#当前CP部分结束帧:17
#当前CP部分帧率:23.97602463
#输出文件路径:X:\temp\tchout.txt
#################################
#并且会在"X:\temp\"输出一个名为"tchout.txt"的文件
#文件的内容是该CP的clip的TC信息
#10,17, 23.97602463
#那么如果是多个ClipSlice需要怎么做呢?很简单,你只需要在后面的ClipSlice中开启append就能办到
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(s=10,e=20,cp="TDecimate(1)",cpmode=1,debug=5,tchout="X:\temp\tchout.txt")
ClipSlice(s=30,e=50,cp="TDecimate(1)",cpmode=1,debug=5,tchout="X:\temp\tchout.txt",append=true)
ClipSlice(s=70,e=100,cp="TDecimate(1)",cpmode=1,debug=5,tchout="X:\temp\tchout.txt",append=true)
#这样的话,输出的文件里就是这样
#10,17, 23.97602463
#
#30,45, 23.97602463
#
#70,93, 23.97602463

#需要注意的是,在第一个ClipSlice后帧数已经发生了改变,所以这时候再找第二段的起始点才是正确的
#如果你只需要处理一段不同帧率的话,你可以试试ClipSlice的debug=6,这样可以直接输出完整TC文件
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(s=10,e=20,cp="TDecimate(1)",cpmode=1,debug=6,tchout="X:\temp\tchout.txt")
#输出完后你就可以关掉debug了
blankclip(pixel_type="YV12",fps=30000,fps_denominator=1001)
ClipSlice(s=10,e=20,cp="TDecimate(1)",cpmode=1)

ClipSlice就是如此,只要您开动脑筋,ClipSlice的用法可以多种多样,这就是ClipSlice主张的灵活性

新旧版区别

ClipSlice为新版

ClipSlice_old为旧版

现在旧版的函数名已经更改为ClipSlice_old

新版与旧版结构以及复杂程度上有了很大的差别。新版作为一个函数,加入到了MYEPTools脚本中,而旧版则继续作为单独的脚本去更新,旧版的更新将会以旧版的结构作为基础。

最终版本

ClipSlice_old v 0.56 Final

ClipSlice v 1.50 beta

下载地址

Google Code:

新版:ClipSlice v1.50

旧版:ClipSlice_old v0.56

为了减轻NMM服务器负担,请尽量使用Google Code的下载地址,如果碰上Google Code被QJ的情况,请使用NMM备用地址

NMM备用地址:

ClipSlice v1.50

ClipSlice_old v0.56

Category:修复脚本