版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

文中用到的名词解释
交错(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做了什么
从ivtc_txt60mc的原理可以看到,我们所需处理的视频的每帧/每场具体对应于上面所述的3:2 pulldown序列中的哪一帧/哪一场是一个关键点,而这就需要正确设置一个帧作为参考点,也就是参数frame_ref,如果设置错误就无法得到期望的结果。
► 显示剧情透露 直接输入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个特典为例:
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")
好吧其实这个例子太复杂了,还是先从简单的看起比较好,第4个特典的处理方式:
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")
注意这里第一个例子中调用了非常多次的ivtc_txt60mc,由于ivtc_txt60mc(srcbob=False)内部调用QTGMC进行Bob,如果像前面介绍的那样直接输入24t+30i给各个ivtc_txt60mc,也就变成调用了同样多次的QTGMC,肯定没法运行。
而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必须死。
上次由 mawen1250 在 2015-12-27 21:07,总共编辑 21 次。
头像
wearsky
帖子: 14
注册时间: 2013-04-30 23:45

Re: ivtc_txt60mc使用教程

感谢mawen菊苣 {:cat_3}
头像
feisty2
帖子: 274
注册时间: 2012-08-05 10:03

Re: ivtc_txt60mc使用教程

求问马文菊苣masktools里有办法能分离帧内的交错和逐行内容混在一起的情况吗 (就是乱剪辑 24fps先telecine成了30之后加了30fps的效果) mt_lutspa只能实现字幕这种i在p的画面下面的分离吧 interlace真是比chroma subsample还可恶 {:cat_5}
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: ivtc_txt60mc使用教程

feisty2 写了:求问马文菊苣masktools里有办法能分离帧内的交错和逐行内容混在一起的情况吗 (就是乱剪辑 24fps先telecine成了30之后加了30fps的效果) mt_lutspa只能实现字幕这种i在p的画面下面的分离吧 interlace真是比chroma subsample还可恶 {:cat_5}
至少我是做不到,当时做LB TVrip时一开始尝试过各种方法把滚动字幕用mask分出来。
像是TDeint内部使用的mask是保留静态部分+一半的场,剩下的一半场中的动态部分取edeint输入的clip。但是由于24t和30i混合后的每个场内部24t和30i信息的时间点就有非线性错位,而这种将非线性错位的60i转为不错位的24p的处理就是一个在时域上非线性的系统,如何才能实现mask merge?

当时试过对字幕部分用QTGMC+插到120fps+无脑砍到24fps的方法,结果发现字幕的24t背景和其余24t部分不同步,这里其实就是因为砍帧后的保留帧选择没有做好,而正确处理的方式其实就是ivtc_txt60mc那种基于参考帧的插帧和删帧方式。
所以一定要EP到极点的话那就把包括滚动字幕的部分都mask出来用ivtc_txt60mc,其余部分用TIVTC。
头像
hydrabbit
帖子: 28
注册时间: 2012-12-31 8:04

Re: ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

interlaced必须死不能再同意! {:cat_3}
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

请问MAWEN菊苣,
24t/d+30i/p是否只出现在有字幕的部分以及前景与背景分别制作的部分?
用VFRHelper处理交错画面时(交错没什么规律,所以试试能否都匹配上),
如果5种匹配方式都无法正确匹配,
是否只能做deint而留下鬼影?
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

alexz220 写了:请问MAWEN菊苣,
24t/d+30i/p是否只出现在有字幕的部分以及前景与背景分别制作的部分?
用VFRHelper处理交错画面时(交错没什么规律,所以试试能否都匹配上),
如果5种匹配方式都无法正确匹配,
是否只能做deint而留下鬼影?
24t、24d、30i、30p都可以放进60i的视频中,所以只要愿意任何组合都可能出现,滚动字幕只是最常见的一种情况。

deint的概念是把以场为单位的视频转换为以帧为单位的视频,手段包括了Weave、Bob、Field Match(+Decimate就是IVTC)。

假设源不存在field blending的情况下。
1. 如果是Weave,就是直接把两个场的内容交错组成一帧,形成的就是Combing,而如果后续使用resize缩小的话就会导致两场的内容混合在一起变成Blending。我们将interlaced的内容读入AVS时已经自动做了Weave,所以就形成了我们看到的交错画面。
2. 如果是Bob,因为是单场插补,也就是intra处理,从理论上就不存在blending的可能性,而像是QTGMC这类加上inter后处理的Bob方式,在Scene-change detection和Motion Estimation正确的情况下也不会出现Blending。
3. 如果是IVTC,24t部分在Field Match匹配正确的情况下不存在Combing,而30i部分交给PP处理也就是Bob,不会产生Blending。但是Decimate处理时如果对Hybrid的处理方式是Blending Decimation,就会产生Blending,例如TDecimate的hybrid=1或hybrid=3。
而TFM默认用PP=6处理Combing,TDecimate默认用hybrid=0。

所以完全不明白为什么会有那么多人搞出Blending的滚动字幕,这是最容易解决的问题——TIVTC默认值都不会产生Blending。
只有需要不产生jerky(运动在时间上的不连续)时才需要像是ivtc_txt60mc这样的手段。
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

mawen1250 写了:
alexz220 写了:请问MAWEN菊苣,
24t/d+30i/p是否只出现在有字幕的部分以及前景与背景分别制作的部分?
用VFRHelper处理交错画面时(交错没什么规律,所以试试能否都匹配上),
如果5种匹配方式都无法正确匹配,
是否只能做deint而留下鬼影?
24t、24d、30i、30p都可以放进60i的视频中,所以只要愿意任何组合都可能出现,滚动字幕只是最常见的一种情况。

deint的概念是把以场为单位的视频转换为以帧为单位的视频,手段包括了Weave、Bob、Field Match(+Decimate就是IVTC)。

假设源不存在field blending的情况下。
1. 如果是Weave,就是直接把两个场的内容交错组成一帧,形成的就是Combing,而如果后续使用resize缩小的话就会导致两场的内容混合在一起变成Blending。我们将interlaced的内容读入AVS时已经自动做了Weave,所以就形成了我们看到的交错画面。
2. 如果是Bob,因为是单场插补,也就是intra处理,从理论上就不存在blending的可能性,而像是QTGMC这类加上inter后处理的Bob方式,在Scene-change detection和Motion Estimation正确的情况下也不会出现Blending。
3. 如果是IVTC,24t部分在Field Match匹配正确的情况下不存在Combing,而30i部分交给PP处理也就是Bob,不会产生Blending。但是Decimate处理时如果对Hybrid的处理方式是Blending Decimation,就会产生Blending,例如TDecimate的hybrid=1或hybrid=3。
而TFM默认用PP=6处理Combing,TDecimate默认用hybrid=0。

所以完全不明白为什么会有那么多人搞出Blending的滚动字幕,这是最容易解决的问题——TIVTC默认值都不会产生Blending。
只有需要不产生jerky(运动在时间上的不连续)时才需要像是ivtc_txt60mc这样的手段。
非常感謝。
我自己也想了一下,請問這樣的理解對嗎(部分老DVD有這個問題):
首先已經確定有大量的場都無法找到能與之完美匹配的場(VFRHELPER走TFM,沒經過TDecimate)。
某一物體(例如某人物的頭部)在兩個相鄰時間點的位置是不同的,
而BOB到60P後,該物體在這兩個時間點的影像同時出現在同一幀內,
這種情況能斷定是場內混合?
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: ivtc_txt60mc使用教程 - 对于24t/24d+30i/30p混合源的处理

mawen1250 写了:判断是否field blending直接SeparateFields()
嗯,谢谢。
已经确定是field blending,
请问这是否意味着基本无解?

回到 “AviSynth”