用于解决混合片源分N段后,帧数不为5的倍数的24d删除重复帧,合并之后音画不同步的问题
具体方法是将帧数不为5的倍数的24d视频分为两段处理,
第一部分的帧数是5的倍数,第二部分的是 第一部分的尾帧+剩余帧
第一部分用TDecimate(或自定义),
第二部分用FDecimate(一个循环没有重复帧时,FDecimate是删去最后一帧(TDecimate则是删去最像重复帧的那帧))
除去第二部分的首帧然后再把尾帧(也许是重复帧,也许不是)补上,再修正帧率,
然后输出timecode
感谢全语种制霸比利的指点,修改了之前的脚本
如果脚本有问题,还请大家帮忙修正
参数说明:
具体用法:DTDecimate(clip c1, clip c2, string dec, string pp, bool first, string tc){
dec,删除重复帧的方法,默认为TDecimate()
pp,对24d部分删帧之后的处理,默认不处理
first,是否对首个clip进行删帧处理,默认不处理,如果有两个clip,强制不处理
tc,timecode文件名,默认timecodes_v1.txt
比如,clip1是30p,clip2是24d,clip3是60p,clip4是24d
代码: 全选
clip1.BillyTC()
\. DTDecimate(clip2)
\. BillyTC(clip3)
\. DTDecimate(clip4)
clip1是24d,clip2是60p,clip3是30p,clip4是24d
代码: 全选
clip1.DTDecimate(first=true)
\. BillyTC(clip2)
\. BillyTC(clip3)
\. DTDecimate(clip4)
代码: 全选
v0=BlankClip(length=100, width=640, height=480, pixel_type="yv12", fps=30000, fps_denominator=1001,color=$000000).killaudio()
v1=BlankClip(length=101, width=640, height=480, pixel_type="yv12", fps=30000, fps_denominator=1001,color=$000000).killaudio()
v2=BlankClip(length=102, width=640, height=480, pixel_type="yv12", fps=30000, fps_denominator=1001,color=$FFFFFF).killaudio()
v3=BlankClip(length=103, width=640, height=480, pixel_type="yv12", fps=30000, fps_denominator=1001,color=$000000).killaudio()
v4=BlankClip(length=104, width=640, height=480, pixel_type="yv12", fps=30000, fps_denominator=1001,color=$000000).killaudio()
v0. DTDecimate(first=true)
\. DTDecimate(v1)
\. DTDecimate(v2)
\. DTDecimate(v3)
\. DTDecimate(v4)
代码: 全选
# timecode format v1
Assume 23.976024
0,79,23.976024
80,159,23.976024
160,160,29.970030
161,241,23.976024
242,242,39.960040
243,324,23.976024
325,325,59.940060
326,408,23.976024
409,409,119.880120
###############################################################################################################
### Requirements:
### "TIVTC"
### "FDecimate"
### "BillyTC" http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=1071
###############################################################################################################
Function DTDecimate(clip c1, clip "c2", string "dec", string "pp", bool "first", string "tc"){
dec = Default(dec, "TDecimate()")
pp = Default(pp, "")
tc = Default(tc, "timecodes_v1.txt")
first = Default(first, false)
b2 = Defined(c2)
first = b2 ? false : first
########################
f1 = c1.framecount
f2 = b2 ? c2.framecount : NOP
L1 = c1.trim(f1-1,-1).AssumeFps(24000,1001)
L2 = b2 ? c2.trim(f2-1,-1).AssumeFps(24000,1001) : NOP
d1 = (b2 == True)
\? c1
\: (first == False)
\? c1
\: (f1 % 5 == 0)
\? Eval("c1.TD(dec)" + chr(10) + pp)
\: (f1 % 5 == 1)
\? Eval("c1.TD(dec) + L1" + chr(10) + pp)
\: Eval("c1.TD(dec) + c1.FD() + L1" + chr(10) + pp)
d2 = (b2 == false)
\? NOP
\: (f2 % 5 == 0)
\? Eval("c2.TD(dec)" + chr(10) + pp)
\: (f2 % 5 == 1)
\? Eval("c2.TD(dec) + L2" + chr(10) + pp)
\: Eval("c2.TD(dec) + c2.FD() + L2"+ chr(10) + pp)
f_d1 = d1.framecount
f_d2 = isclip(d2) ? d2.framecount : NOP
########################
a1 = (f1 % 5 ==0)
\? NOP
\: String(f_d1-1) + "," + String(f_d1-1) + "," + String(last_fps(c1))
a2 = (b2 == False)
\? NOP
\: (f2 % 5 == 0)
\? NOP
\: String(f_d1-1+f_d2) + "," + String(f_d1-1+f_d2) + "," + String(last_fps(c2))
o1 = "first ? d1.trim(0,f_d1-2).BillyTC(tc=tc) + d1.trim(f_d1-1,-1).AssumeFps(24000,1001) : c1.BillyTC(tc=tc)"
o2 = "d1.BillyTC(d2.trim(0,f_d2-2),tc=tc) + d2.trim(f_d2-1,-1).AssumeFps(d1.framerate)"
########################
return (b2 == False && f1 % 5 == 0)
\? d1.BillyTC(tc=tc)
\: (b2 == False)
\? Eval(o1).WriteFileStart(tc, "a1", append=True )
\: (f2 % 5 == 0)
\? d1.BillyTC(d2,tc=tc)
\: Eval(o2).WriteFileStart(tc, "a2", append=True )
}
Function TD(clip src,string "dec"){
fc = src.framecount
return Eval("src.trim(0,fc-1-fc%5)." + dec)
}
Function FD(clip src){
fc = src.framecount
return src.trim(fc-1-fc%5,fc-1).FDecimate(23.976024).trim(1,0)
}
Function last_fps(clip src){
fc = src.framecount
return (fc % 5 == 1)
\? pFrac2Str(30000,1001,6)
\: (fc % 5 == 2)
\? pFrac2Str(40000,1001,6)
\: (fc % 5 == 3)
\? pFrac2Str(60000,1001,6)
\: (fc % 5 == 4)
\? pFrac2Str(120000,1001,6)
\: 0
}
[/syntax]