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:修復腳本