交错(Comb):按场编码的图像合并为帧后,导致帧中出现了时间点错位的两个场的内容,在变化的图像中能看到交错条纹而在静止的图像中通常看不到。
60p: 编码为progressive的视频信号(每帧都是无交错内容),60指帧率
30p:编码为progressive的视频信号(每帧都是无交错内容),30指帧率;也可以指编码为interlaced的60i视频信号但是无交错,下面的24t+30p和24d+30p就指这种。
24p: 编码为progressive的视频信号(每帧都是无交错内容),24指帧率
60i: 编码为interlaced的视频信号(是否交错看具体情况),60指场率
30i: 60i的信号中每两个场的时间点都不相同(交错),这里用的30i实际是为了方便与24t等其他类型的交错区别开而习惯使用的表示方法,不算是严格的表示形式
24t: 60i的信号中每3:2个场的时间点相同,由24p信号经过Telecine(3:2 pulldown)转换而成(无交错和交错的循环:PIIPP,5帧中2帧交错)
24d:60i的信号中每2:2:2:4个场的时间点相同/每1:1:1:2个帧的时间点相同,由24p信号经过2:2:2:4 pulldown转换而成(无交错,5帧中2帧重复)
24t+30i: 60i的信号中画面内同时包含24t和30i的情况,24t部分PIIPP,30i部分始终交错
24t+30p: 60i的信号中画面内同时包含24t和30p的情况,24t部分PIIPP,30p部分无交错
24d+30i: 60i的信号中画面内同时包含24d和30i的情况,24d部分5帧重复2帧,30i部分始终交错
24d+30p: 60i的信号中画面内同时包含24d和30p的情况,24d部分5帧重复2帧,30p部分无交错
► 显示剧情透露 ivtc_txt60mc做了什么
► 显示剧情透露 直接输入24t+30i如何设置frame_ref(按帧判断)
1.像是动画片源本身往往有很多静态帧,所以常常5帧里只看到有1帧交错,这时可以先假设看到的交错帧为PIIPP循环中的第二个,然后继续检查下去,如果发现出现循环中的第三个也为交错,那么假设成立;如果发现循环中的第一个为交错,说明假设不成立,一开始看到的那个交错帧为PIIPP中的第三个。
——这个看起来感觉很拗口,不过实际做起来就很容易明白了。
2.有些片源在切换场景时会发生Telecine的帧循环改变的情况,这时只能再单独一段段分开来处理,如下面的例子。
3.由于QTGMC很耗内存(特别是在设置了SourceMatch=3后),通常都需要用SetMemoryMax手动设置一个较高的内存上限,一般最好能在1500以上,如果设置的内存不足,很可能就会见到0.1fps都不到的速度……
DragonBall Z: Battle of Gods的10个特典就有大量的在切换场景时发生的Telecine的帧循环改变的情况。以其中最丧心病狂的第10个特典为例:
CODEBOX_PLUS_CODE: [全选]
[CODEBOX_PLUS_EXPAND/CODEBOX_PLUS_COLLAPSE]
SetMemoryMax(2000)
LWLibavVideoSource("K:\Dragon Ball Z Battle of Gods\BSTD03677\BDMV\STREAM\00010.m2ts", threads=1)
txt1 = 60
txt2 = 81
txt3 = 107
#
txt4 = 216
txt5 = 228
txt6 = 240
txt7 = 268
#
txt8 = 458
txt9 = 486
txt10 = 502
txt11 = 540
#
txt12 = 730
txt13 = 780
#
fieldr1 = 1
fieldr2 = 2
fieldr3 = 4
fieldr4 = 1
fieldr5 = 3
fieldr6 = 0
fieldr7 = 2
fieldr8 = 3
fieldr9 = 2
#
video1 = 15
video2 = 60
video3 = 429
video4 = 458
video5 = 613
video6 = 677
Bob60 = QTGMC(preset="Slower", Border=True, SourceMatch=3, TR0=1, TR1=1, TR2=1)
txt_1 = Bob60.Trim(txt1*2, txt2*2-1).ivtc_txt60mc(fieldr1, True)
txt_2 = Bob60.Trim(txt2*2, txt3*2-1).ivtc_txt60mc(fieldr2, True)
txt_3 = Bob60.Trim(txt4*2, txt5*2-1).ivtc_txt60mc(fieldr3, True)
txt_4 = Bob60.Trim(txt5*2, txt6*2-1).ivtc_txt60mc(fieldr4, True)
txt_5 = Bob60.Trim(txt6*2, txt7*2-1).ivtc_txt60mc(fieldr5, True)
txt_6 = Bob60.Trim(txt8*2, txt9*2-1).ivtc_txt60mc(fieldr6, True)
txt_7 = Bob60.Trim(txt9*2, txt10*2-1).ivtc_txt60mc(fieldr7, True)
txt_8 = Bob60.Trim(txt10*2, txt11*2-1).ivtc_txt60mc(fieldr8, True)
txt_9 = Bob60.Trim(txt12*2, txt13*2-1).ivtc_txt60mc(fieldr9, True)
fm = TFM(mode=3, mChroma=True, PP=6, slow=2, MI=60, clip2=Bob60.SelectEven())
fm.Trim(0, video1-1).TDecimate(mode=1, hybrid=0)
BillyTC(tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video1*2, video2*2-1), tc="SP10.tc.txt")
\.BillyTC(txt_1 ++ txt_2 ++ fm.Trim(txt3, txt4-1 ).TDecimate(mode=1, hybrid=0) ++ txt_3 ++ txt_4 ++ txt_5 ++ fm.Trim(txt7, video3-1).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video3*2, video4*2-1), tc="SP10.tc.txt")
\.BillyTC(txt_6 ++ txt_7 ++ txt_8 ++ fm.Trim(txt11, video5-1).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video5*2, video6*2-1), tc="SP10.tc.txt")
\.BillyTC(fm.Trim(video6, txt12-1 ).TDecimate(mode=1, hybrid=0) ++ txt_9 ++ fm.Trim(txt13, 0 ).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
LWLibavVideoSource("K:\Dragon Ball Z Battle of Gods\BSTD03677\BDMV\STREAM\00010.m2ts", threads=1)
txt1 = 60
txt2 = 81
txt3 = 107
#
txt4 = 216
txt5 = 228
txt6 = 240
txt7 = 268
#
txt8 = 458
txt9 = 486
txt10 = 502
txt11 = 540
#
txt12 = 730
txt13 = 780
#
fieldr1 = 1
fieldr2 = 2
fieldr3 = 4
fieldr4 = 1
fieldr5 = 3
fieldr6 = 0
fieldr7 = 2
fieldr8 = 3
fieldr9 = 2
#
video1 = 15
video2 = 60
video3 = 429
video4 = 458
video5 = 613
video6 = 677
Bob60 = QTGMC(preset="Slower", Border=True, SourceMatch=3, TR0=1, TR1=1, TR2=1)
txt_1 = Bob60.Trim(txt1*2, txt2*2-1).ivtc_txt60mc(fieldr1, True)
txt_2 = Bob60.Trim(txt2*2, txt3*2-1).ivtc_txt60mc(fieldr2, True)
txt_3 = Bob60.Trim(txt4*2, txt5*2-1).ivtc_txt60mc(fieldr3, True)
txt_4 = Bob60.Trim(txt5*2, txt6*2-1).ivtc_txt60mc(fieldr4, True)
txt_5 = Bob60.Trim(txt6*2, txt7*2-1).ivtc_txt60mc(fieldr5, True)
txt_6 = Bob60.Trim(txt8*2, txt9*2-1).ivtc_txt60mc(fieldr6, True)
txt_7 = Bob60.Trim(txt9*2, txt10*2-1).ivtc_txt60mc(fieldr7, True)
txt_8 = Bob60.Trim(txt10*2, txt11*2-1).ivtc_txt60mc(fieldr8, True)
txt_9 = Bob60.Trim(txt12*2, txt13*2-1).ivtc_txt60mc(fieldr9, True)
fm = TFM(mode=3, mChroma=True, PP=6, slow=2, MI=60, clip2=Bob60.SelectEven())
fm.Trim(0, video1-1).TDecimate(mode=1, hybrid=0)
BillyTC(tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video1*2, video2*2-1), tc="SP10.tc.txt")
\.BillyTC(txt_1 ++ txt_2 ++ fm.Trim(txt3, txt4-1 ).TDecimate(mode=1, hybrid=0) ++ txt_3 ++ txt_4 ++ txt_5 ++ fm.Trim(txt7, video3-1).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video3*2, video4*2-1), tc="SP10.tc.txt")
\.BillyTC(txt_6 ++ txt_7 ++ txt_8 ++ fm.Trim(txt11, video5-1).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
\.BillyTC(Bob60.Trim(video5*2, video6*2-1), tc="SP10.tc.txt")
\.BillyTC(fm.Trim(video6, txt12-1 ).TDecimate(mode=1, hybrid=0) ++ txt_9 ++ fm.Trim(txt13, 0 ).TDecimate(mode=1, hybrid=0), tc="SP10.tc.txt")
CODEBOX_PLUS_CODE: [全选]
[CODEBOX_PLUS_EXPAND/CODEBOX_PLUS_COLLAPSE]
SetMemoryMax(2000)
LWLibavVideoSource("K:\Dragon Ball Z Battle of Gods\BSTD03677\BDMV\STREAM\000"""+mstr+""".m2ts", threads=1)
txt1 = 495
txt2 = 570
#
fieldr = 0
#
video1 = 92
video2 = 147
Bob60 = QTGMC(preset="Slower", Border=True, SourceMatch=3, TR0=1, TR1=1, TR2=1)
txt = Bob60.Trim(txt1*2, txt2*2-1).ivtc_txt60mc(fieldr, True)
fm = TFM(mode=3, mChroma=True, PP=6, slow=2, MI=60, clip2=Bob60.SelectEven())
fm.Trim(0, video1-1).TDecimate(mode=1, hybrid=0)
BillyTC(tc="SP04.tc.txt")
\.BillyTC(Bob60.Trim(video1*2, video2*2-1), tc="SP04.tc.txt")
\.BillyTC(fm.Trim(video2, txt1-1 ).TDecimate(mode=1, hybrid=0) ++ txt ++ fm.Trim(txt2 , 0 ).TDecimate(mode=1, hybrid=0), tc="SP04.tc.txt")
LWLibavVideoSource("K:\Dragon Ball Z Battle of Gods\BSTD03677\BDMV\STREAM\000"""+mstr+""".m2ts", threads=1)
txt1 = 495
txt2 = 570
#
fieldr = 0
#
video1 = 92
video2 = 147
Bob60 = QTGMC(preset="Slower", Border=True, SourceMatch=3, TR0=1, TR1=1, TR2=1)
txt = Bob60.Trim(txt1*2, txt2*2-1).ivtc_txt60mc(fieldr, True)
fm = TFM(mode=3, mChroma=True, PP=6, slow=2, MI=60, clip2=Bob60.SelectEven())
fm.Trim(0, video1-1).TDecimate(mode=1, hybrid=0)
BillyTC(tc="SP04.tc.txt")
\.BillyTC(Bob60.Trim(video1*2, video2*2-1), tc="SP04.tc.txt")
\.BillyTC(fm.Trim(video2, txt1-1 ).TDecimate(mode=1, hybrid=0) ++ txt ++ fm.Trim(txt2 , 0 ).TDecimate(mode=1, hybrid=0), tc="SP04.tc.txt")
而ivtc_txt60mc(srcbob=True)支持直接输入Bob后的clip,所以就可以将一个QTGMC处理后的clip作为所有ivtc_txt60mc的输入。同时frame_ref的意义也相应地变了。
我这个例子里QTGMC没有像ivtc_txt60mc内部使用Lossless=2参数,是因为这个片源里有一些缓慢运动的30i的内容(视觉上无交错条纹,而是呈锯齿状边缘),加上以后会由于将其错误判断为无交错成分而还原出锯齿。
► 显示剧情透露 输入Bob后的24t+30i如何设置frame_ref(按场判断)
► 显示剧情透露 24t+30p、24d+30i、24d+30p同样可以处理
当然,最后还是要说一句,interlaced必须死。