简介:QTGMC(avsi文件)Plugin1是一款面向AVISynth平台的高级去交错滤镜脚本,主要解决隔行扫描视频转逐行扫描时出现的闪烁和锯齿问题,适用于视频压制、DVD与蓝光源处理以及电视信号转码等场景。压缩包共2个文件,包括QTGMC-3.32.avsi脚本和QTGMC-3.32.html说明文档,整体大小约37KB,文件少而精,便于直接放入AVISynth工作目录使用。已有648人学习下载,对熟悉AviSynth脚本语法的用户来说,资源包内不仅提供了可复用的去交错函数调用示例,还通过HTML文档说明了Strength、Preserve Detail、Temporal Smoothing等参数的作用,方便根据片源类型微调处理强度,在保留细节与平滑画面之间取得平衡。脚本基于时间梯度中值滤波算法,处理时会参考相邻帧信息以减少细节损失,适合在压制或转码流程中作为预处理环节。整体来看,这是一份轻量、实用且定位清晰的插件参考资料。 用QTGMC之前,我一直以为去交错就是把两个场合并一下就完事了,直到我接手一档1080i的纪录片素材,在电脑上预览时满屏都是锯齿和抖动,我才意识到隔行视频这块水有多深。当时处理方案里最绕不开的就是QTGMC这个avsi脚本,研究了一阵子才把它理顺。这篇东西不打算写成一板一眼的教程,就按我实际操作中走过的路、踩过的坑,把QTGMC的部署逻辑、avsi文件的正确玩法,以及把它当成一个“插件单元”(很多人管这个叫Plugin1)去集成到处理管线里这套事,完整讲一遍。
1. QTGMC在解决什么问题:隔行视频的“梳子效应”
1.1 为什么视频素材一到电脑上就“花屏”
早期的电视信号带宽有限,传输一帧完整的画面太奢侈,所以发明了隔行扫描:把一帧画面拆成奇数场和偶数场,先扫奇数行,再扫偶数行。CRT电视靠荧光粉余晖和眼睛的视觉暂留,把这两个场“骗”成一幅完整画面,观感没问题。但到了电脑、手机这类渐进式显示设备上,如果直接把两个场拼在一起当成一帧显示,运动物体的边缘就会出现明显的横向梳状锯齿,专业说法叫“combing”,我们更常叫它“梳子效应”。你去看看老电视剧、演唱会DVD原盘、电视台录制的live素材,基本都能见到。
更麻烦的是隔行素材在时间轴上也不老实。两个场采集的其实是不同时刻的画面,物体在移动时,奇偶场之间的位置差会被保留下来,显示出来就是边缘抖动、闪烁,字幕和高光区域尤其明显。视频剪辑软件里单帧预览肉眼看不出,一播放就露馅,这就是为什么反交错在视频处理流程里从来不是可选项,而是必经之路。
1.2 从“简单bob”到运动补偿:QTGMC的核心思路
早期工具的去交错思路很简单:要么只取一个场丢掉另一个,要么把两个场混合,要么做线性插值。这些方案各有硬伤:丢场会损失一半垂直分辨率,画面变糊;混合会让动态画面出现“鬼影”;线性插值在平坦区域还行,一到纹理边缘就露怯。后来出现了基于边缘方向的插值算法(比如Yadif、NNEDI),效果好了不少,但对剧烈运动还是力不从心。
QTGMC(QuickTime Guide Motion Compensated,严格点说它的名字来源并不是这五个词的缩写,社区里约定俗成这么叫)走的是另一个路线:先用运动估计(motion estimation)分析视频中物体的运动矢量,再沿着运动轨迹做时间域滤波,把两个场里“该属于同一时刻”的内容找出来并合并。它的核心机制可以粗暴理解为三步:先把隔行画面bob成两个完整帧,然后用MVTools算出运动向量,最后在运动补偿的基础上做中值/均值滤波,把交错产生的伪影平滑掉。这样出来的画面没有梳齿,运动平滑,细节保留度还很高,所以从SD到1080i压制DVD、BDMV、电视录播,QTGMC基本成了社区默认的“最优解”。
2. avsi文件:QTGMC正确的“安装姿势”藏在细节里
2.1 avs和avsi看起来像,工作机制却完全不同
AviSynth用户都知道,.avs是普通脚本文件,你用的时候要么打开它,要么用Import()手动加载。而.avsi是启动脚本,只要放进AviSynth的plugins目录,程序启动时会自动加载,不需要你在脚本里写任何加载语句。这一点对QTGMC来说极其关键。
QTGMC本质上不是一个二进制滤镜,它是一整套AviSynth脚本函数集合,发布的时候就是一个QTGMC.avsi文件。你如果每次用的时候都手动Import("QTGMC.avsi")再写滤镜链,那当然也能跑,但这种做法容易遇到几个问题:一是路径写错一次就报错;二是加载顺序一乱,依赖的函数可能找不到;三是换机器部署时忘了复制脚本,直接整个流程失败。把QTGMC.avsi放到plugins目录,让AviSynth自动加载,这些问题就全部消失。你打开一个脚本直接调用QTGMC(),它就是“原生”存在的函数,和你系统里其他滤镜没什么两样。
我见过很多人在这上面卡住:插件装了,QTGMC函数却提示“there is no function named QTGMC”,十有八九就是avsi文件没放到正确位置,或者放进去之后没重启脚本宿主(AvsPmod、MeGUI、StaxRip这类工具都要重启才能重新加载插件)。这个问题的典型排查路径,我后面专门讲。
2.2 只有avsi文件是远远不够的:依赖链是重灾区
QTGMC虽然是个脚本文件,但脚本内部调用的滤镜全是一堆外部DLL。如果这些DLL没装全,QTGMC加载时不会马上报错,而是在你真正调用函数时才提示缺少某个滤镜,这时候排查起来比直接报错恶心得多。QTGMC的核心依赖链包括:
| 依赖滤镜 | 作用 | 缺失时的典型报错 |
|---|---|---|
| MVTools | 运动估计与运动补偿核心 | there is no function named MVAnalyse / MVSCalculate |
| MaskTools2 | 掩膜处理,QTGMC做边缘mask依赖它 | no function named mt_edge |
| NNEDI3 | 高质量边缘引导插值,用于场间补点 | no function named nnedi3 |
| RGTools | 提供remap等像素操作工具 | no function named rgbtorgba 等 |
| avsresize或fmtconv | 颜色格式转换和高精度处理 | no function named ConvertBits / z_ConvertFormat |
其中MVTools和MaskTools2是最容易出问题的。尤其是MVTools版本,QTGMC新版对MVTools的版本号有要求,你拿一个很老的MVTools配新版QTGMC,就算能加载也会在跑动时出现莫名其妙的崩溃或画面碎裂。我的建议是直接装AviSynth+(64位),然后从官方发布页把所有依赖一次性下载全,版本对不上宁可不用,也不要随意混搭。
3. Plugin1式部署:把QTGMC当成一个独立插件单元来管理
3.1 目录布局和依赖清单怎么搭
有些封装工具(比如StaxRip、Hybrid,甚至你自己写的批处理工具)里,会把QTGMC整体看成一个“插件”,显示名称可能就叫Plugin1或者其他编号。说白了,QTGMC这个avsi文件连同它背后的依赖DLL,本质就是一个可以插拔的处理单元。你不需要关心它内部几百行脚本是怎么写的,只要保证它被正确加载,然后传入视频帧,拿回来反交错后的结果就行。
我推荐的目录结构很简单,所有依赖DLL和脚本全部放到AviSynth+的plugins目录下:
C:\Program Files\AviSynth+\plugins64\ ├── QTGMC.avsi ├── mvtools.dll ├── masktools2.dll ├── nnedi3.dll ├── RGTools.dll ├── avsresize.dll └── fmtconv.dll64位系统就全部用64位版本,千万别混着来。32位AviSynth跑QTGMC的另一个大问题是内存上限,1080i的素材做高精度处理时内存经常飙到2GB以上,32位进程直接OOM,跑一半进程崩掉,素材白处理。从这个角度看,直接用64位AviSynth+不是选配,而是建议。
3.2 加载验证:AVSMeter是排查利器
部署完之后,不要急着跑大片源,先做一个加载验证。用AVSMeter或者AvsPmod写一个最小测试脚本,内容就一行:
Version()先确认AviSynth本体没问题,然后把测试脚本改成:
Import("QTGMC.avsi") BlankClip(width=1920, height=1080, pixel_type="YV24") QTGMC(InputType=1)运行后用AVSMeter看输出,能正常出帧就说明脚本加载成功。如果报“there is no function named QTGMC”,优先检查avsi文件是否在plugins目录、文件名是否改了,以及宿主工具的插件路径是否指向了正确目录。AviSynth+支持设置自定义插件目录,很多封装工具会覆盖默认的plugins路径,导致你明明放了文件却加载不到,这一点在排查时必须先确认。AVSMeter启动时也会打印出它实际加载了哪些插件,这个列表就是你的第一手诊断依据。
如果AVSMeter没有打印出QTGMC相关行,通常不是文件缺失,而是路径问题:要么宿主工具指定了独立的插件目录,要么是32/64位混用导致扫描不到对应dll。把宿主工具的插件搜索路径改成AviSynth+的plugins目录,或者把QTGMC.avsi复制到宿主工具的插件目录里,问题基本都能解决。
4. 写第一个QTGMC脚本:参数选型的实际经验
4.1 一个能跑的基线模板
最终得到一段可用的QTGMC调用,我的基线模板是这样:
LoadPlugin("...\ffms2.dll") FFVideoSource("input.mkv") QTGMC(Preset="Fast", FPSDivisor=2) Prefetch(4)如果你在AviSynth+里用LWLibavVideoSource加载素材,第一步可以简化成:
LWLibavVideoSource("input.mkv") QTGMC(Preset="Fast", FPSDivisor=2) Prefetch(4)这个模板里最关键的两个参数就是Preset和FPSDivisor。Preset控制QTGMC内部整体质量与速度的权衡,FPSDivisor控制输出帧率:隔行素材一般输入是50i/60i,场率是50/60,FPSDivisor=2会输出25/30帧的渐进式视频,这也是大多数人压制隔行DVD/BD时的目标帧率;如果你想要50/60p的丝滑动态效果,就设FPSDivisor=1。注意这俩参数不是随便选的,直接用场率(50/60)作为输出帧率,对存储空间和编码压力都更大,但对体育类、动态多的素材感知差异非常明显。
4.2 Preset、TR系列和SourceMatch的取舍逻辑
QTGMC最让人头疼的就是参数太多,新手容易把Preset开到最高然后坐等“慢工出细活”,结果一集视频跑一晚上都没跑完。我实测下来,1080i60的素材,在一颗主流八核CPU上,Preset="Very Fast"大约能跑到12-15fps,Preset="Fast"大约8-10fps,Preset="Slower"就只有2-3fps了,Preset="Placebo"更是慢到怀疑人生。不同机器配置差异很大,但基本量级不会差太多。所以你选Preset之前,先想清楚这个素材到底值不值得花三倍时间。
QTGMC的参数设计里,决定质量的核心不只是Preset,还有TR0、TR1、TR2这组时间递归参数。TR0到TR2控制的是时间轴上做多少次递归滤波,数值越大,降噪和去闪烁的能力越强,但也越容易抹掉细节、产生涂抹感。Preset的档位本质上就是在改这些内部值,以及切换EdiMode(边缘插值算法)、NoiseProcess(降噪处理)等开关。我自己的经验是:
- 普通访谈、静态居多的素材,Preset="Fast"完全够用,细节保留和速度性价比最高;
- 动作片、现场演出这种动态特别强的,至少上Preset="Medium",必要时开SourceMatch;
- 动画类素材,QTGMC默认参数偏“视频化”,容易把线条搞软,建议用Tuning="Smooth"或者干脆换其他方案;
- 4K/高分辨率素材,QTGMC慢到离谱,先确认源是不是真隔行,很多4K源已经是渐进式,不需要跑QTGMC。
SourceMatch这个参数值得一提:它能从隔行源中恢复更多原始细节,画质上限更高,但代价是慢、且可能引入振铃(ringing)伪影。我一般只在高质量BDMV、DVD原盘这类源上开SourceMatch,网络流媒体录像这种码率本来就不高的素材,开了反而画质观感下降。总之,参数不是越高越好,而是按源状态去匹配。
5. 实战中容易翻车的几个细节:我的排查链路记录
5.1 颜色不对了:八成是色彩格式没对齐
用QTGMC处理素材时最常遇到的怪现象是输出画面偏绿、偏紫,或者颜色发闷。这个坑我一开始也踩过,后来发现基本不是QTGMC本身的问题,而是输入色彩格式没对齐。QTGMC内部默认按YUV格式处理,如果源是RGB画面(比如某些录屏、游戏采集源),直接进QTGMC就会出现颜色错乱。解决办法是在调用QTGMC之前加一句ConvertToYV12()或者ConvertToYV24(),把RGB转成YUV再处理。处理完后如果要输出给剪辑软件用,再转回RGB,并且别忘了设对色彩矩阵(Rec.601还是Rec.709)。用AviSynth+的话,更好的做法是用ConvertBits和z_ConvertFormat做高位深、色彩空间全程管理,避免中间转换损失。
排查这条链路的时候,我在AVSMeter里逐帧检查过输出,确认了问题出在色彩空间不匹配,而不是QTGMC算法bug。这里也提醒一下:如果你在加完QTGMC后颜色还是不对,先检查色彩格式,再去怀疑滤镜参数,顺序反了你可能折腾半天都是白费。
5.2 多线程不生效:MTMode不是设了就完事
我在第4节给的模板里有一行Prefetch(4),但如果你在AviSynth+里跑QTGMC,光写Prefetch是不够的。QTGMC这个滤镜是脚本函数,默认情况下AviSynth+的多线程调度器不会自动给它分配合适的MTMode,结果就是你写了Prefetch(4),任务管理器里看着CPU占用率却只有25%。你必须在调用QTGMC之前告诉AviSynth+这个滤镜可以多现场处理:
SetFilterMTMode("QTGMC", MT_MULTI_INSTANCE)这一行要写在QTGMC()调用之前、Prefetch之前。MT_MULTI_INSTANCE的意思是AviSynth+会为QTGMC创建多个独立实例并行处理不同帧,对QTGMC这种无状态(帧间有依赖但依赖具备确定性)的脚本滤镜尤其合适。我遇到过有的项目里忘了写这一行,同一段1080i素材从5fps变成不到1.5fps,效果完全一样,纯粹是白等。
还有一个容易被忽略的点:调用顺序。AviSynth+加载插件和脚本函数的顺序影响MTMode的注册。如果你在SetFilterMTMode之前已经隐式加载了QTGMC(比如avsi自动加载时),某些版本可能已经注册了默认MT_SERIALIZED模式,后面设MT_MULTI_INSTANCE也不一定生效。保险做法是在脚本最开头、所有滤镜加载完成之前就写上SetFilterMTMode,并且用AVSMeter检查实际的线程渲染模式。
5.3 QTGMC不是万能药:哪些素材别碰它
反交错领域有一句话:遇到隔行源,先分辨是真隔行还是伪隔行。很多电视节目、流媒体录制,虽然扫描方式是隔行的,但内容本身可能是从24p电影转来的,也就是“telecine”过的软拉丝素材。这种素材直接上QTGMC,虽然也能处理出结果,但其实你是在用昂贵的运动补偿去解决一个IVTC(反向影视拆帧)就能解决的问题,既慢又可能把原始24p序列的节奏破坏掉。遇到这类素材,正确做法是先做IVTC(AviSynth里的TFM+TDecimate,或者VapourSynth里的其他方案),确认残余的硬交错再交给QTGMC收拾残局。
另外,低码率网络视频的隔行源,不要用QTGMC的极限参数。这类素材本身压缩痕迹重、块效应明显,QTGMC的高精度时间滤波会把压缩噪声也当成画面内容去处理,结果不仅伪影没消干净,还可能放大马赛克。先做轻量降噪(比如hqdn3d、dfttest)再反交错,效果反而更好。QTGMC这名字虽然看着霸气,但选不选它、用什么档位,永远要跟着片的性质走。
我自己的习惯是,把QTGMC参数封装成几个预设,平时处理直接调用封装好的函数,不再每次手敲一长串参数。比如把“电视访谈类”“动作电影类”“演唱会现场类”各存一套参数,avsi文件里做个包装函数,名为QTGMC_Preset(...),内部根据我的需求去调QTGMC()。这样管线里QTGMC这个Plugin1单元就是高度内聚的:部署一次,参数可复用,换机器也不慌。如果你也在VapourSynth那边干活,需要注意的是QTGMC有对应的py版本,核心算法同源,但加载和参数传递方式不同,别把AviSynth的脚本直接搬过去用。隔行素材这事,处理过一次你就懂了,工具本身不神秘,真正决定成片质量的,是你对素材的判断和参数的克制。
本文还有配套的精品资源,点击获取