上次在这篇帖子里提到了ovr的利用,今天来详细写写。
好长时间没码字了,那么今天就来写一个可能很多高手都会解决的问题,那就是利用TIVTC的自动记录交错与手动OVR脚本来手动指定Post-processing的动作。
在IVTC过程中,一部分帧会走PP,也就是被送去Deinterlace。但是这部分帧当中,有一部分是因为匹配失败而被PP(确实找不到合适的场匹配结果),有一部分是匹配成功但被误判为交错送去PP,而通常情况下只有较少的一部分帧是真正因为无法找到合适的匹配而出现交错的(也就是第一种情况)。
TIVTC的匹配精度很高,绝大多数情况下不会出现错匹配的情况(但是我也遇到过极少数例外的情况发生,需要通过ovr手动指定匹配pattern,这个下次有时间再写)。
TIVTC的问题在于,他的默认参数比较灵敏,在后处理检测时微小的交错也能察觉出来,因此容易造成误判,特别是动画OP/ED中的字幕,经过PP之后,文字不断抖动,非常难看。而那些参数又非常难以调整,常常是这边调好了,那边又坏掉了。虽然通过OVR也可以单独分段指定参数,但我还是建议使用默认参数,最后通过OVR来针对出错的帧进行修正。
因此,我们就需要结合TIVTC的记录输出功能和OVR手写脚本功能来“强制”TIVTC对我们指定的帧进行PP或者不进行PP。
我们首先要找出哪些帧出了问题。之前我注意到,不少同学还在使用我好多年前用ConditionalFilter + decomb写的那个交错侦测脚本,其实现在TIVTC里面已经内置了相当丰富的交错侦测功能,独立函数ShowCombedTIVTC和IsCombedTIVTC在调试TFM的cthresh、 MI、 chroma、 blockx、 blocky、 metric等参数方面很好用,也可以结合ConditionalFilter写出来交错侦测的脚本,但我们今天要用的是TFM内置的output参数来输出log文件。
首先,我们需要构建出来一个avs脚本,让tfm输出log文件。这个过程相当于IVTC过程的1pass,我们不需要通过这个脚本输出成品,因此要让这个脚本高速地执行,快速得到我们要得log文件。
- 1pass.avs:
- d2v = "op.d2v"
- MPEG2Source(d2v)
- tfm(d2v=d2v, mode=3, pp=1, slow=2, chroma=true, output="log.txt")
- crop(8,8,16,16)
复制代码 各个参数的目的是在保证检测精度的情况下尽量提高速度。
log.txt就是我们要输出的log文件。我们可以用VDM打开这个avs,然后通过Direct Stream Copy模式输出为.avi(它在我的E8400 CPU上跑出了150fps)。完成之后,.avi可以直接删除,留下log.txt供我们分析。
(注意,请不要用MeGUI去压这个脚本,用MeGUI压制的话tfm之会输出一个空文件,而得不到我们要的log。更不要试图修改log文件,因为之后载入log文件的时候,tfm会检测log文件是否发生过改变。)
压制结束之后,我们会得到一个不小的文件,他包含了tfm对每一帧的处理方式、判断结果。但我们真正需要的是这个文件尾部以#号开头的那一段。
一段典型的该部分log会像下面一样(中文部分是我的注释):
- #
- #
- # OVR HELP INFORMATION:
- #
- # [COMBED FRAMES]
- #以下是被判断为交错、需要走PP的帧。前面是帧号,后面是该帧的交错度。
- #
- # [Individual Frames]
- # FORMAT: frame_number (mic_value)
- #
- # 1544 (256)
- # 1545 (256)
- # 1546 (256)
- # 1547 (87)
- # 1548 (108)
- # 1563 (82)
- # 1566 (92)
- # 1569 (99)
- # 1570 (99)
- # 1571 (95)
- # 1572 (110)
- # 1578 (256)
- # 1579 (256)
- # 1613 (256)
- # 1614 (256)
- # 2184 (170)
- #
- # [Grouped Ranges Allowing Small Breaks]
- # FORMAT: frame_start, frame_end (percentage combed)
- #这部分是被判断为微动或者bad cut渐变等连续交错的地方,同样应该留意
- #
- # 1544,1548 (100.0%)
- # 1563,1579 (47.1%)
- # 1613,1614 (100.0%)
- #
- #
- # [POSSIBLE MISSED COMBED FRAMES]
- #下面是tfm觉得交错程度较大,被判断为可能交错的帧,但因为不够阈值设定的值,因此不会走PP,仅提供用户肉眼确认、参考。
- #
- # FORMAT: frame_number (mic_value)
- #
- # 455 (17)
- # 470 (16)
- # 950 (40)
- # 1559 (76)
- # 1560 (76)
- # 1564 (75)
- # 1565 (75)
- # 1567 (74)
- # 1568 (74)
- # 1576 (69)
- # 1577 (65)
- # 1620 (72)
- # 1621 (72)
- # 1623 (73)
- # 1624 (73)
- # 1625 (78)
- # 1626 (70)
- # 1627 (71)
- # 1631 (69)
- # 2177 (20)
- # 2182 (19)
- # 2187 (42)
- # 2192 (58)
- #
- #
- # [u, b, AND AGAINST ORDER (n) MATCHES]
- #使用了u、b、n这三种匹配方式,得到了“无交错匹配”的帧。为什么说“无交错匹配”而非“正确匹配”呢,因为DVD在制作中可能存在一些bad cut或者Telecine制作错误,u、b、n这三种匹配方式通常可以有更大的几率获得无交错的帧,但是也有可能造成画面一顿一顿的(恰好匹配到了和上一帧或下一帧相同的画面),因此tfm也认为这些帧需要肉眼确认。如果确认发生了jerkness,用户可以通过ovr来选择是输出无交错的帧好,还是通过pp输出一个模糊一些但保持动态的帧好。但这并非本文讨论话题,所以只略微提及一下,详细的……等有时间再写吧。
- #
- # FORMAT: frame_number match or range_start,range_end match
- #
- # 319 u
- # 347 u
- # 387 u
- # 428 u
- # 730 u
- # 826 u
- # 920 u
- # 948 u
- # 1511 u
- # 1580 u
- # 1615 u
复制代码 我又写了一个脚本来逐帧确认交错情况。
- check.avs:
- d2v = "op.d2v"
- MPEG2Source(d2v)
- tfm(d2v=d2v, mode=3, pp=1, slow=2, chroma=true)
复制代码 用vdm或者au打开它,跳到[COMBED FRAMES]这段log中提到的帧,逐帧检查,并最终确认1544、1545、1546、1578、1579、1613、1614真正存在交错,其余全部是误判。现在,只需要用记事本写一个文件,告诉tfm其余帧是清白的即可(将误判为交错的帧用-号标记,强制tfm将这些帧直接输出)。
当然,如果你愿意,也可以检查[POSSIBLE MISSED COMBED FRAMES]里面记录的帧的情况,这部分帧被认为是可能存在交错的帧,输出时,这些帧会被当作好帧直接输出。如果这部分帧中真的存在交错,应该在ovr文件中用+号标记。
- ovr.txt:
- 1547 -
- 1548 -
- 1563 -
- 1566 -
- 1569 -
- 1570 -
- 1571 -
- 1572 -
- 2184 -
复制代码 之后我们通过tfm载入之前的log和ovr文件,并引入PP、decimate。
- MPEG2Source(d2v)
- tfm(d2v=d2v, mode=3, pp=4, slow=2, chroma=true, input="log.txt", ovr="ovr.txt")
- tdecimate(mode=1)
复制代码 这里说明一下,通过input载入之前的log文件可以提高tfm的速度,因为tfm直接从log文件中读取之前做过的计算结果,可以不用再次进行匹配了。而input(也就是tfm自己的计算结果)和ovr文件中指定的策略、参数冲突的时候,ovr的优先权高。
虽然这种工作对于OP/ED来说比较繁重,但是这样通常能够得到更完美的效果。
后记:
TFM的ovr功能超级丰富,几乎可以匹敌手动IVTC的效果。而配合output参数,我们可以用更高的效率来得到更好的结果。
关于p、c、n、b、u等匹配方式,以及通过ovr来指定pattern其实也不是很困难,tfm的readme里面都有很详细的说明。有时间的同学不妨阅读一下。 |