AVS教程

AVS教程
AVS教程

在本章中,我们来学习AviSynth,并手工创建AVS脚本。AVS在DVDRip制作中是至关重要的一个步骤,直接影响到画质好坏。因此,AVS也是无数Ripper花大力气研究的对象。当积累了一定经验和熟练度之后,创建AVS脚本是一件相当有乐趣且轻松的事情。有经验的Ripper看到片源之后,立刻就可以基本确定需要使用那些滤镜、怎样搭配滤镜参数,之后,只要进行细微的调整,便可得到希望的效果。新手成为老手,需要一个积累经验的过程,除了多看别人的心得、遇到问题勤于提出之外,就只剩下自己多做片、积累实战经验。经验的积累是一个较长的过程,因此不要梦想阅读了某篇文章后一夜之间成为所谓高手,经验不会骗人,因此脚踏实地才是正确的道路。

有点说多了。现在来提一下提高AVS运用水平的两条小经验:

1. 英语要好,因为大多数滤镜的文档都是E文的,且很少有中文翻译版;

2. 善于使用各种搜索引擎,比如GOOGLE、一些论坛的搜索引擎等。

3. 善于提问。在提出问题之前,看看说明、用搜索引擎搜索一下,这样一来,应该说85%的问题都能够很好的解决。这样不但为别人省去了麻烦,而且这样学来的知识最牢固。

废话不多说了,我们来进行——

第一节AviSynth简介

AviSynth是AVI SYNTHesizer的缩写,意思就是AVI合成器,是一个Frameserver。(Frameserver就是一个把影像文件从一个程序转换到另外一个程序的过程, 其间没有临时文件或中介文件产生)

AviSynth是由Ben Rudiak-Gould首创的一种非常有用的工具,能够提供各种方式来处理影像文件。最独特的就是AviSynth并不是一个独立的影像处理程序,而是在影像文件和影像处理软件之间担任“中间人”的角色。

AviSynth的基本工作原理是这样的:

首先由使用者建立一个包含特定命令的文本,称之为“脚本”(后缀为avs),这些命令指定要运行处理的影像文件和滤镜;

然后运行影像应用程序,比如VD或ND,打开脚本。此时AviSynth就开始工作了,打开脚本中指定的影像文件,运行特定的滤镜,并把输出结果提供给影像应用程序。但影像应用程序并不了解AviSynth在后台所做的处理,而认为是直接打开了一个“被处理过”的影像文件。

第二节AVS语法及基本应用技巧——写给新手

既然要编写脚本,就要知道怎么写。在本节中,我们结合实例来了解一下AVS脚本的基本语法。只有懂得了写法,才能更好的运用。当然,不少人会觉得本节都是废话——那么恭喜你,你已经是老手了,你可以直接跳到下一节。

AVS 脚本的语法非常类似于C语言的语法,但比C要简单得多。如果你有一定的C语言(或以C为基础的脚本语言,如PHP)的编写经验,那么你会发现AVS 竟然是如此的简单——

你甚至可以跳过本节直接进行下节的内容。比如,笔者有过将近一年的PHP编程经验,当接触到AVS的时候,几乎没有花费任何力气就上手了。

跟往常一样,先了解几个概念。

函数——函数的英文名字叫function,这个词在英文中还有“功能”意思,没错!AVS 中绝大部分的功能都是通过各种各样的函数来实现的。至于“函数” 的确切定义,高一《数学(上册)》中写得很明白,笔者就不废话了。AVS中的函数按调用方式分为两类,一种是内置函数,一种是外挂函数。内置函数已经放置在AviSynth软件内部,可以在脚本中直接调用;外挂函数不包含于AviSynth中,需要在脚本中额外加载相应的DLL文件或其他AVS 脚本函数才能调用。AVS包含的众多内置函数我们将会专门抽出一节来介绍。

外置函数可以在网上下载得到。正是因为这点,AVS被赋予了几乎无限的扩展性,我们可以通过在网上找到各种函数来实现五花八门的功能。忘记说了,有些人喜欢管“函数”叫做“滤镜(filter)”或“插件(plugin)”,实际上这么叫也是正确的,就连AVS的众多官方文档都称之为滤镜、插件。但是就笔者个人来说,更愿意叫“函数”,因为这些“滤镜”的使用方式是函数的f(x)的形式。

参数——既然有函数,就要说参数。如果说函数是实现某样功能用的,那么参数就是告诉函数通过什么方式实现、实现到什么程度等等的信息。上面说的f(x)的调用形式,f是函数名称,x就是参数。有的函数一个参数就够了,有的函数却要很多参数,四个、五个、十多个。比如Telecide这个函数如果把所有的参数加起来一共有十四个之多。好在不是所有的参数都是必要的。有些参数可以写也可以不写。如果不写,函数就会自动使用其内部的默认值。但是,如果必写的参数不写,那么函数就无法启动。

变量——变量可以简单的理解成某个对象的名字(实际上要复杂一些^^;;)。比如,我们规定“本文作者=大虾”,那么当我们提到“本文作者”的时候,我们的第一反应就是那个叫“大虾”的家伙,HeiHei。

好了,下面我们借个一段极其简单的范例来了解一下AVS的语法:

#plugin

LoadPlugin("E:\gk\AviSynthPlugins\DGDecode.dll")

#source

mpeg2source("F:\dvdrip-temp\soultaker.d2v")

#crop

crop(4,4,712,476)

#resize

LanczosResize(640,352)

上面的例子中,“#”后面跟着的句子是被“注释”掉的。注释是什么意思呢?就是说,AviSynth 读到这句话的时候,一看到这句话前面有“#”,就会54 (无视)它,继续读到下一行。编写脚本写注释是一个好习惯,尤其是极其复杂的脚本。这种情况AVS脚本大概不会遇到,但是当编写PHP的时候,成千上万行的代码如果没有注释……那无论是试图阅读代码的人还是作者本人,都会头晕脑胀。

糟糕——扯远了。我们回到主题。

紧接着下面,“LoadPlugin”,这是一个函数的名字,后面的括号“()”中的内容就是参数。LoadPlugin函数的功能是载入插件,后面括号中的参数便是告诉函数,要载入

“E:\gk\AviSynthPlugins\DGDecode.d ll”这个插件。

Mpeg2source是包含于上面提到的“DGDecode.dll”中的外挂函数,也就是说,如果不加载DGDecode.dll这个文件的话,mpeg2source就无法使用。

Crop是AviSynth的内置函数。这里涉及到了多参数函数。这个函数有四个参数,每个参数之间用“,”隔开(注意是英文逗号,不是中文逗号)。

函数的写法多种多样,像LanczosResize函数,只有两个参数,所以我们写“640,352”即可。但是像前文提到的Telecide这样复杂的函数,我们需要将参数的名字也写进去。比如:Telecide(order=1,guide=1,post=2,vthresh=25,show=true)

其中,order、guide、post等等的,就是参数名称,参数名称和参数值之间用“=”连接(废话!)。

还有一点要注意,数值型(比如1、25之类的)/真假型(true或者false)的参数,不需要用双引号(英文双引号)引起来。但是,字符型的参数,必须要用双引号引起来。例如:mpeg2source("F:\dvdrip-temp\soultaker.d2v",idct=7)

这个例子很明白,"F:\dvdrip-temp\soultaker.d2v"是字符型的变量值,要加双引号;7是数字型的参数,不用加双引号。

下面介绍一些小花招,让我们的处理更加轻松。

AVS技巧1:使用变量

当我们在一段AVS之中需要打开多段片源、需要分别处理的时候,就要用到变量。请看下面的例子:

Clip1=avisource(“d:.avi”)

Clip2=avisource(“d:.avi”)

Clip3=clip1+clip2

Return(clip3)

在这个例子中,clip1、clip2、clip3都是变量,现在你也能够理解变量的概念了吧。

很明显,我们在clip3中将前两个片源合并在了一起,然后用return函数输出clip3,我们在视频编缉软件中最终看到的结果是:播放1.avi,1.avi放完后,紧接着放2.avi。

当然,这里只是举例子,其实合并没这么简单的,因为两段片源的fps、分辨率、颜色模式都要完全相同。至于怎么让他们“完全相同”,将会在后面的章节中讲到。这里只是要大家了解变量是什么东西。

AVS技巧2:“.”的妙用

看下面的AVS脚本:

v1=avisource("C:.avi").ConvertToYUY2()

v2=avisource("C:.avi").ConvertToYUY2()

……

这样写等价于:

v1=avisource("C:.avi")

v1= ConvertToYUY2(v1)

v2=avisource("C:.avi")

v2= ConvertToYUY2(v2)

是不是省了很多事?赫赫~在编写复杂的脚本的时候尤其好用~(至于ConvertToYUY2是什么东西……我们后文再讲)

AVS技巧3:分段处理

就算是同一影片在不同的段落中也会表现出来不同的特色。有时候我们需要对一些片源进行特殊处理,这就用到了截取。还是先看例子:

Source=avisource(“c:\clip.avi”)

Clip1=trim(source,0,1999)

Clip2=trim(source,2000,3000)

……

这样,我们就用trim函数分别截取了影片的0~1999(包括1999)号帧和2000~3000帧。下面就能针对两段影片分别进行处理了。

有一点请注意:0号帧也算一帧,0号帧其实是影片的第一帧,1号帧是第2帧,依此类推……我们截取到1999号帧,事实上截取了2000帧!自然,2000号帧是影片的第2001帧。

AVS的基础语法以及一些小技巧就讲到这里了,更多的应用技巧还希望大家自己去探索。这一章对已经掌握AVS的人来说可能是废话,但是对于从来没接触过AVS得初心者,却是需要重点掌握的。俗话说,工欲善其事,必先利其器。要写好AVS脚本,必须要打好基础才行。

第三节AVS常用滤镜介绍

一、常用内置滤镜

本节大虾偷懒,转载一篇精品论坛的经典文章给大家看。(既然有人写好了,大虾自然可以偷懒了~HiaHiaHiaHia)本文在原文的基础上略微修改了一下,还望作者见谅。

AviSynth内建了数目繁多的滤镜,所以只能介绍一些最常见实用的一部分。

1、源文件滤镜

①AVISource

用于导入AVI格式的影片,需要安装相应的Codec才能导入。

例:AVISource(“test.avi”)

②WAVSource

导入WAV

例:WAVSource(“test.wav”)

2、处理滤镜

①AddBorders

加边:给影像加黑边。参数是整数,顺序是左、上、右、下。

例:AddBorders(0,64,0,64)

就是给图像上下各加64像素的黑边。这个滤镜似乎并不常用。

②ConvertToRGB 和ConvertToYUY2

改变颜色环境:

VD和AviUtl第三方滤镜有的需要RGB环境才能运行,需要ConvertToRGB来进行切换。有的RAW文件是RGB的,但一些AVISynth滤镜只能运行在YUV下,就需要用ConvertToYUY2来处理。

关于颜色环境的问题,请参阅本文第三章相关内容。

例:ConvertToRGB()

改变成RGB颜色环境

??ConvertToYUY2()

改变成YUV颜色环境

③Crop

切边:为了保持比例或切除黑边,参数是整数,顺序是左、上、宽、高。

例:Crop(8,0,704,480)

左右各切去8像素。

④Levels

层次:调节亮度、对比度和Gamma值。

例:Levels(0,1.2,255,0,255)

调整Gamma,使画面变亮

⑤LanczosResize

缩放滤镜:LanczosResize是BicubicResize的替代者,提供更精准、更锐利的画质。在日本普遍使用,欧美大多使用BicubicResize。本来是日本人开发的第三方滤镜,自AviSynth 2.05版本开始吸收为内置滤镜。

例:LanczosResize(640,480)

把分辨率改变为640*480

⑥Tweak

??调整:可以调节色度,饱和度,亮度,对比度。

??色度:-180.0~180.0,默认0.0。正数趋向红色,负数趋向绿色。

??饱和度:0.0~10.0,默认1.0。0.0为黑白。

??亮度:-255.0~255.0,默认0.0。

??对比度:0.0~10.0,默认1.0。

3、编辑滤镜

①FadeIn 和FadeOut

淡入和淡出:提供淡入和淡出功能,尤其是淡出功能,可以使影片结束地更自然。参数为整数,表示需要编辑的帧数。

例:FadeOut(24)

影片最后24帧淡出

②Trim

截取:可以截取某段影片。参数为整数,表示需要编辑的开始帧和结束帧。

例:Trim(240,480)

截取240~480帧这一片断

4、声音滤镜

①AudioDub

影音合并:可以把影像和声音合并在一起。

例:Video = AVISource("test.avi")

??Audio= WAVSource("test.wav")

??AudioDub(Video,Audio) #把test.avi和test.wav合并

②GetLeftChannel 和GetRightChannel

获取声道:把立体声的左右声道单独返回,适用于左右声道不同语种的WAV。

例:stereo=WavSource("test.wav")

??return GetLeftChannel(stereo)

返回test.wav的左声道

③DelayAudio

声音延迟:由于从VOB里分离的AC3通常有延迟,所以用Azid转码得到的WAV也有延迟,在用AudioDub合并时就需要加上这个延迟。

例:WavSource("test.wav").DelayAuido(0.5) #把test.wav延迟半秒

以上便是AviSynth的常用内置函数。

二、常见的外挂滤镜

AviSynth最强大之处就是有数目繁多、功能强大的外置(或称“第三方”)滤镜;同时还可以调用VD以及AviUtl的滤镜;甚至还有特别开发的接口,可以让TMPGEnc和AviUtl 读取AVS。和内置滤镜不同,外置滤镜需要先调用声明,再可以使用。

(1)源文件滤镜

①MPEG2Dec

由dividee编写的读取DVD2AVI产生的d2v工程文件的滤镜,同时内建去除Noise的TemporalSmoother。

例:LoadPlugin("MPEG2Dec.dll")

MPEG2Source("test.d2v")

②MPEG2Dec2

trbarry在MPEG2Dec的基础上进行了改进,支持P4的SSE2指令集。用文本编辑工具打开d2v,把iDCT_Algorithm=?改成5就可以了。速度很快,效果也好,推荐P4 CPU的用户使用。

例:LoadPlugin("MPEG2Dec2.dll")

MPEG2Source("test.d2v")

③MPEG2Dec3

在MPEG2Dec2的基础上再进行了改进,加入了Nic的图像后处理(PP),一定程度上可以减少Noise。好像除了P4的SSE2外,还加入了AMD的3D Now!优化,目前还在开发中,是个非常有前途的滤镜。

例:LoadPlugin("MPEG2Dec3.dll")

MPEG2Source("test.d2v",CPU=4) # CPU=4就是开启了PP模式

(2)处理滤镜

①ColorYUY2

颜色补偿:Kiraru2002编写的滤镜。由于经过编码,得到的结果和DVD相比较,颜色有所改变,所以要对颜色进行补偿。

例:LoadPlugin("ColorYUY2.dll")

ColorYUY2(0,10,0,10,0,0,0,0,0)

②ChangeFPS()

改变影片帧率,iphone一般来说支持最大30fps。

例:ChangeFPS(23.976)

#改变影片帧率有几种数值12、15、20、23.976、24、25、29.97、30这几种,一般来说不改变也行。

③undot()

消除噪点,可以使用一个或多个,可以连在一起用,自己看效果体会。

无参数,直接加上就行了。undot滤镜是进行象素及细小噪点降噪,一般用来去除细小的、肉眼不容易察觉的噪点,所以具体效果上并不明显。

例:加在其它滤镜后,使用多次。

LoadPlugin("UnDot.dll")

DirectShowSource("test.avi")

UnDot()

LanczosResize(480,272)

UnDot()

或者:

UnDot().UnDot().UnDot().UnDot()

具体用暴风预览效果。

④FluxSmooth()

柔化兼有降噪功能,比UnDot()作用要强些.

例:LoadPlugin("fluxsmooth.dll")

fluxsmooth(5,7)

一般用这个默认(5,7)

⑤KenKunNR()

KenkunNR是WarpSharp自带的降躁插件,具体参数KenKunNR(threshold=1 to 3),数值越大,强度越大。

例:LoadPlugin("WarpSharp.dll")

KenKunNR(threshold=1)

⑥deen()

降噪锐化功能. 用后画面就会比较干净,但细节都被抹杀. 视情况而用

例:LoadPlugin("deen.dll")

#deen("c2d",2,3,3) 较轻

#deen("a3d",3,3,1,3) 较轻

#deen("c2d",2,6,6) 中等

#deen("a3d",3,6,1,6) 中等

#deen("c2d",2,10,12) 强力

#deen("a3d",3,10,1,12) 强力

⑦SpatialSoften()

空间轴柔化滤镜。基本参数3个,如SpatialSoften (4,8,8)第一个指柔化程度,数值不要太大,2-5之间,后2个是亮度域值和色彩域值,均为整数型数值,需要测试调节.

⑧TemporalSoften()

时间轴柔化滤镜。

例:Temporalsoften(2,3,3,mode=2,scenechange=6)

#一般用这个参数就行了

⑨Convolution3d()

3D柔化滤镜.参数一般动画用animeHQ,电影用movieHQ.

例: LoadPlugin("Convolution3d.dll")

#转电影

Convolution3d("movieHQ")

#转动画

#Convolution3d("animeHQ")

⑩sharpen()

锐化滤镜:数值越大, 锐化效果越强.

例:sharpen(0.2) 一般取0.2~0.3

○11 WarpSharp()

锐化滤镜: 主要改动depth,bump这两个数值

越下面的线条越细

例:LoadPlugin("WarpSharp.dll")

#WarpSharp(depth=30,blur=2,bump=40,cubic=-0.6)

#WarpSharp(depth=40,blur=2,bump=60,cubic=-0.6)

#WarpSharp(depth=60,blur=2,bump=96,cubic=-0.6) #线条比上细,全屏的时候,明显感觉出锯齿○12 mergechroma(blur(1.3))

模糊滤镜.

柔化滤镜可以参考一些自动生成的模板,如

# 1) little noise

#Temporalsoften(2,3,3,mode=2,scenechange=6)

#mergechroma(blur(1.3))#可以换成MergeLuma(blur(1.0))

#FluxSmooth(5,7)

#

# 2) medium noise

#Temporalsoften(3,5,5,mode=2,scenechange=10)

#Convolution3d("moviehq")

#FluxSmooth(7,7)

#

# 3) heavy noise

#Temporalsoften(4,8,8,mode=2,scenechange=10)

#Convolution3d("movielq")

#FluxSmooth(10,15)

可以使用其中的一套,使用具有处理效果的滤镜会增加压片的时间.片源不好就按需选用些.总之能尽量少用就少用,或者干脆不用.

Blur(0,1)是模糊滤镜,设置了垂直参数可以消除些边缘刻痕

可以连续加载Blur(0,1).Blur(0,1)

可以结合MergeChroma 或者MergeLuma来使用,如MergeLuma(Blur(0,1)Blur(0,1))Blur(-1)就相当于锐化滤镜了

(3)交错滤镜

Decomb

IVTC和Deinterlace滤镜:由Donald A.Graft编写,新增加的专门处理NTSC格式动画的mode=2,要和Avisynth2.05以上版本使用,不然速度会慢一倍。

guide 0~2,默认0,NTSC用1,PAL用2,可以提高IVTC准确度。

gthresh 0~100,默认15,控制区分不同帧的程度。

post 默认true,用来处理IVTC遗漏的细节,使画面略微模糊。

threshold 0~255,默认15,控制post的程度。

dthreshold 0~255,默认9,控制threshold判定IVTC遗漏的程度。

blend 默认true,在交错画面用渲染来替代填充。

chroma 默认false,在交错画面的亮度色度调整。

cycle 2~25,默认5,每n帧删除1帧,NTSC选5,PAL选25。

mode 0~2,默认2。

mode=0 对cycle里最相近的帧不进行处理。

mode=1 对cycle里最相近的帧进行处理,用于处理混合帧速。

mode=2 在一个很长的范围里进行帧对比,可以正确处理动画里由8帧或12帧复制为29.97帧的情况。

Threshold 默认0,控制mode=1时的处理重复帧的程度,Threshold默认100,控制mode=2

时的处理重复帧的程度。

Quality 0~3,默认2,采样和色度的质量,与速度成反比。

但是最近的几个版本似乎都存在一个问题,就是处理后的画面有波动现象,并伴随影片里文字闪烁现象,所以还是用老版本的保险。

例:LoadPlugin("Decomb.dll")

Telecide(Guide=1,Gthresh=50,Chroma=True,Quality=3,Post=false)

Decimate(cycle=5) # NTSC 3:2 PullDown

LoadPlugin("Decomb.dll")

Telecide(Guide=1,Gthresh=50,Chroma=True,Quality=3,Post=false)

Decimate(Cycle=5,Mode=2) # NTSC Progressive和Interlaced混合

LoadPlugin("Decomb.dll")

Telecide(Guide=2,Gthresh=50,Chroma=True,Quality=3,Post=false)

Decimate(Cycle=25) # PAL

上面简单介绍了AviSynth的里的一些常用的滤镜,还有很多滤镜的功能有待遇您自己开发,还有重要的一点想说一下:avs脚本及其各种滤镜主要适用于大码率媒体文件的处理,也即我们经常接触的DVDRIP/TVRIP avi的制作优化。而对于高度压缩格式的rmvb来说,我们利用的avs滤镜更应该持慎重态度(如亮虑镜、字幕虑镜、画面调整等少数几个)!也就是说avs在rmvb压制方面,我们需要的是利用avs灵活的“中间人”的角色!而不是为了avs 而去压制!我看到好多朋友初步接触rmvb压制,就在用avs压制DVDRIP-rmvb,完全套用个别论坛给出的avs脚本,里面全是各种滤镜,如3D增强、柔化、去丝等!这些滤镜如果制作DVDRIP的avi那是会获得肯定的画质效果,但是用于rmvb压制,仿佛就是东施效颦,忠言逆耳!real压制的原理和高码率的mpge4编码是不同的,后者有视频上层的概念,因此滤镜的修饰作用可以体现。我看Doom9讨论avs时,主要还是处理各种大数据量影像媒体为主。如处理自己DV录制的影视、电视卡录制的视频源之类的等。而众所周知的影响real媒体压缩效果就是片源效果。VCD片源的再怎么处理也不可能达到DVD的效果,而DVD片源,再怎么胡乱压制也不会差到哪里。因此avs直接在rmvb的压制中需要适当选择,而不能盲从,特别是对于各种滤镜的选择更要注意。一句话AviSynth非常灵活,要按具体情况具体分析。

第四节复习:IVTC/Deinterlace应对策略

接下来的数节中,我们将讲解IVTC/Deinterlace。IVTC/Deinterlace无论如何都是一个值得大书特书的过程,DVDRip一半的质量都是取决于IVTC/Deinterlace的好坏。

首先,我们先了解一些概念。

24p:本章经常会遇到这个概念,意思就是,24fps无交错的胶片,经过胶卷过带,最终形成的30fps、每五张中有两张交错的片源。

30i:意思是,30fps、张张都Interlace(交错)的片源。

场匹配反交错:这个动作一般对象指得是24p的影片,通过对(前)中后三帧进行场匹配(具体原理下文会讲),还原原本没有交错的画面。注意,是还原!这样还原出来的帧和原来没有交错的帧理论上应该是一模一样的。场匹配反交错是在帧与帧之间进行的。Deinterlace:反交错,通过一定手段,让原本交错的帧显得不再交错。注意,是“显得不再交错”而不是“还原”,经过Deinterlace的画面与原本的画面是有很大差别的。Deinterlace只在本帧内进行,是对单幅画面的处理。注意,Deinterlace一定要和场匹配反交错这个概念区分开!否则读下文的时候会非常糊涂。

接下来,我们先来复习一下各种类型片源的处理方案(大虾偷懒,引用Silky大人的文章)。

a)24p(也叫Film、3:2 pulldown型)

有些影片,讯源是24fps,拍摄的时候是用胶片以24fps拍摄的,每一张都没有交错,例如大部分的电影。为了要能在NTSC 的电视上播放,电影胶卷过带(telecine)的时候必须转成30fps(即前面说过的3:2 pulldown)。

这种影片,其原始画面其实是24fps无交错的,可以作IVTC,经过场匹配反交错、删除多余的画面,还原回原本的24fps。

大部分的电影,无庸置疑,其讯源一定是24fps无交错,可以作IVTC。

电影转成PAL(25fps)的时候,用的是2:2 pulldown,画面还是无交错的,只是加快播放速度,变成每秒播放25 张。不过有些PAL 的DVD 会向前提一个场,造成画面每一张都交错。

还有一些PAL DVD 非常奇怪,25 张之中会有重复的一张画面,这时就必须删除重复的那一张画面还原回24p,删除重复帧的步骤叫做Decimate,后文详述制作方法。

b)30i(也叫Video型)

这种片源通常由摄像机拍摄得到,每一张都是交错的。大部分的NTSC 电视节目(连续剧、综艺节目、新闻报导...)、交错式的DV 都是这种讯源。对付这种讯源,通常会采用Deinterlace的处理方式,经过这种方式处理过后,画面可能会变得模糊一些。

c) 30fps progressive, 30p

30fps 每一张都没有交错,例如计算机动画

这种讯源,当然什么处理都不用作。你可以直接跳过IVTC/Deinterlace这个步骤。

d) Hybrid, Mixed 混合24p/30p

在动画DVD 上面常见,例如片头是30fps progressive,每一张都没有交错,本篇却是24fps progressive,五张之中有两张交错;或者是CG 的部分30p,其它部分24p。

做成AVI,AVI 只能用一种固定的fps,所以可以分开做的话分开做,把24p 和30p 的部分分成两个AVI,例如片头30p 一个AVI,本篇24p 一个AVI。如果不好分开,例如几乎都是24p,只有中间CG 的部分30p,只好强制24fps 做下去,这样30p 的部分会顿,不过也没办法了。

如果做成30fps,24p 的部分每四张要重复一张,也是会顿。

最好的做法是转成120fps

120 是24 和30 的最小公倍数,做成120fps,可以兼顾24p 和30p,不会顿,又不用牺牲画面。至于120fps影片的制作方法,涉及到很多方面,因此不列入本文讨论范围,网上此类教程比较多,读者可以自行参考研究。

或者干脆放弃AVI,改用.mkv 等可以支持变动frame rate(VFR)的文件格式。

e) Hybrid clip, Mixed, 混合24p/30i, 混合24p/48i, 混合xxx/xxx .....

例如部分24fps progressive,五张之中有两张交错,部分30fps interlaced,每一张都交错。这种片源通常使用Telecide和Decimate函数进行处理(下文有详述)。

f) Hybrid Frame或其它乱七八糟的型式

一个Frame 之中,部分交错,部分没交错。例如有些影片的字幕、工作人员名单是telecine 之后才叠加上去的,造成背景画面没交错,前景字幕却是交错的。这种情况应做Deinterlace。

还有错误的DVD mastering,剪接的时候少掉一张,图场颠倒,enocder 的IVTC 错误,造成frame 画面无法补回无交错的状态.....等等。这些类型较难处理,可能需要更为精确的手动IVTC/Deinterlace处理,还可能涉及到120fps的AVI的制作。所以在这里,笔者建议不熟练掌握技术的朋友放弃这两种类型,或者寻找更佳的片源。

第五节讲解:用Decomb做IVTC/Deinterlace

在复习完了各种片源类型之后,我们正式开始介绍Decomb。Decomb是Donald A. Graft 开发的一套IVTC/Deinterlace滤镜包,是现在使用最广泛的反交错插件,功能强大,速度快(像是在做广告)。本文来介绍一下使用Decomb中包含的Telecide、FieldDeinterlace、Decimate三个函数来完成IVTC或Deinterlace的任务。

首先介绍Telecide函数。

Telecide的作用是IVTC中的去交错。因为它只负责去交错,所以Telecide只完成了整个IVTC工作中的一半,另一半删除重复帧的任务,需要配合Decimate函数来完成。删除重复帧做法,我们在下文讲解。

Telecide一般用于NTSC 3:2 pulldown(24p)、PAL 2:2 pulldown、24p/30i hybird这三种类型影片的反交错处理,如果片源不属于以上三种类型,请不要使用Telecide。

首先介绍一下Telecide反交错的原理。Telecide在默认的情况下会通过一种叫做FieldMatch(场匹配)的技术来完成反交错的工作。我们以BottomField First为例,讲解FieldMatch的原理。

当Telecide 函数收到一个AVS传来的请求的时候,它会读取当前帧(下文用C表示,即Current)与下一帧(下文用N表示,即Next),并将这两帧拆成由奇数扫描线组成的Top Field (下文用t表示)和由偶数扫描线组成的Bottom Field(下文用b表示)两个场(Top和Bottom 其实就是基数场和偶数场,只是叫法不一样),如下图:

此时,Telecide函数会用Cb场分别与Ct和Nt两个场进行组合(如果是Top Field First,Telecide就会以Ct为基准进行组合):

Ct

Cb(组合一)

Nt

Cb(组合二)

然后,Telecide会对这两种组合方案进行比较,选择交错比较小的一种输出。注意!是选择交错小的一种输出,而不是选择无交错的一种输出。因为在一些情况下,经过FieldMatch 仍然无法找到匹配的场,所以这种情况下,输出的结果仍然可能是交错的。

下面以2:3 pulldown的片源为例,对这个过程进行实例说明。

当Telecide收到对C帧进行反交错处理的请求之后,它会读取C帧和D帧,并将两帧拆分成2O、3E(C帧)和3O、4E(D帧):

这时,Telecide会以3E为基础,将其与2O和3O两个场进行组合:

2O

3E(组合一)

3O

3E(组合二)?Bingo!中奖~组合正确无交错~

Telecide会对上面两种方案进行比较,然后输出交错较小的一种。

按照上面的方法,一段2:3 pulldown的片源经过处理之后就变成了下面的样子:

我们可以看到,经过场匹配处理之后每帧都无交错,但其中D、E两帧重复了!如果把这样的结果拿去播放的话,会发现画面一顿一顿的,所以去交错之后,还需要删除重复帧才

能够正常播放。

下面说明一下Telecide函数在应用过程中的注意事项:Telecide要求输入的片源水平分辨率必须是2的正整数倍,颜色区间必须是YUV2或者YV12(关于颜色区间,请参阅第四章相关内容)。在Telecide之前,请不要进行任何Resize(变形)操作,因为分辨率的改变可能会导致Telecide在场判断上出现误判,造成场匹配失败。在Telecide之前,不要进行任何颜色区间转换操作,因为颜色区间的转换很可能造成交错帧颜色错误,影响Telecide的场判断,造成场匹配失败。还有一点,片源中的噪声会影响Telecide的场判断,请尽量使用噪声小的片源。

在了解了Telecide反交错的基本原理与注意事项之后,我们来详细介绍一下Telecide函数的参数。由于Telecide的参数太多了(惊人的14 个参数!),所以无法做到一一详细讲解。这里只介绍几个重要的参数,更多的进阶设定,请参考Decomb附带的《Decomb参考手册》。

Telecide函数基本语法:

Telecide()

Order 参数:对于正确的还原原始影像,设定正确的场顺序非常重要,所以我们首先确定order参数。场顺序通过参数order来设定,本参数为必选参数。设定order=1为TopField First,设定order=0为BottomField First。因为确定正确的场顺序实在太重要了,所以强烈建议你按照下面的方法确认场顺序,而不是猜测场顺序。

要确定场顺序,需要建立一个不对片源进行任何处理的AVS脚本。首先照下面建立一个AVS脚本来分离TopField:

#调用MPEG2解码器

LoadPlugin("E:\gk\AviSynthPlugins\DGDecode.dll")

#导入片源

mpeg2source("F:\dvdrip-temp\soultaker.d2v")

#进行场分离

AssumeTFF().SeparateFields()

现在,用VirtualDubMod(简称VDM,下同)打开上面AVS脚本,然后找到一段包含运动物体的影片并步进向前(一帧一帧地向前),注意运动物体是一直朝它该去的方向运动,还是在运动过程中突然向回运动。比如,如果场顺序错了,本来应该一直朝右侧运动的物体在运动过程中突然向左跳一下,然后继续朝右运动;如果场顺序正确,那么它会平稳的一直向右运动。

如果使用AssumeTFF().SeparateFields()的时候物体运动正常,则该段影片的场顺序是TopField先,需要设定order=1;如果运动不正常,则是偶数场先,需要设定order=0。如果你想进一步确认是否是偶数场先,使用AssumeBFF().SeparateFields ()。

我们假设我们的片源是奇数场优先。到目前为止,我们的Telecide参数是下面的样子:

Telecide(order=1)

Guide参数:(范围0~3,默认0即关闭)

Telecide 内置了一个功能叫做Pattern Guidance。这个功能用于对特定类型的影片的帧序和场序进行预测,以获得更快的处理速度和更好的处理效果。当Pattern Guidance开启的时候,它会对影片的场序进行预测,并有权推翻FieldMatch机能的场匹配方案,同时选用预测方案进行场匹配。由于Pattern Guidance适用的范围有限,所以需要知道影片的确切类型才能开启Pattern Guidance。

Pattern Guidance通过Guide参数控制。Guide参数有四个值,设定guide=0关闭pattern guidance;设置guide=1使用3:2 pulldown模式(片源是24fps->30fps的);设置guide=2使用2:2模式(适用于PAL制式);设置guide=3使用3:2:3:2:2模式(片源为25fps->30fps,较少见)。

首先确定你的片源是否是PAL制式。如果是,并且其内容为progressive,你可以直接设定guide=2来使用PAL模式。当然,如果片源不含progressive,你就根本不应该用Telecide()。所以对于PAL,我们的Telecide参数是下面的样子:

Telecide(order=1,guide=2)

如果我们的片源是NTSC 29.97fps或30fps,那么事情就要复杂一些。首先我们要确定片源是否为3:2 pulldown生成的。有很多测试方法可以使用。第一种,直接用VDM打开片源,并且不要进行任何处理。然后找到一处包含运动物体的片段,步进前进。如果你看到3帧非交错画面和2帧交错画面循环出现,那么就可以确定是3:2 pulldown了。大多数电影都是用的3:2 pulldown。

像象上面讲的那样寻找3:2循环并不十分简单,比如一些动画包含重复的帧,很难清楚地发现3:2循环。

所以我们还有第二种方法,你可以用下面的AVS脚本打开片源,然后看Telecide()怎样返回结果。(注意,一定要正确的设定场顺序。)

LoadPlugin("E:\gk\AviSynthPlugins\DGDecode.dll")

LoadPlugin("E:\gk\AviSynthPlugins\Decomb.dll")

mpeg2source("F:\dvdrip-temp\soultaker.d2v")

Telecide(order=1,guide=1,post=0,show=true)

用VDM 打开这个AVS脚本,然后多抽取几段影片浏览。如果Telecide()报告"in-pattern"或"in-pattern*",那么这段影片就是3:2 pulldown。如果报告"out-of-pattern"或" in-pattern "、"out-of-pattern"来回跳动,那么片源就不是纯3:2 pulldown。

如果你确定片源中含有大量3:2内容,那么就应该设定guide=1。如果3:2占的比例不高或者不能确定片源种类,那就设置guide=0。我们假设我们的片源种3:2 pulldown含量很高,我们的Telecide参数是下面的样子:

Telecide(order=1,guide=1)

Post参数(范围0~5,默认2)、vthresh参数(0.0~255.0,默认50.0):我们将这两个有密切联系的参数放在一起讲解。

在一些情况下,某些帧在场匹配的时候,不能找到合适的匹配,所以Telecide输出的结果仍然会有交错。这时候,Telecide就会启动Postprocessing(后处理)机能,对这种帧进行Deinterlace处理。

Postprocessing 由参数post控制,设定Post=0关闭Postprocessing;设置Post=1计算metrics 但不实际进行deinterlace;设置post=2计算metrics并进行deinterlace;设置post=3计算metrics、进行deinterlace,并在经过deinterlace处理的帧上显示deinterlacing动态图。Post=1和3主要是进行调试参数时使用。最后正式输出的时候应该用post =2。此外,还有两个更加高级的模式,参见《Decomb参考手册》。

通过vthresh参数,我们设定交错和非交错帧被分别来开的“阈值”(这里穿插一点小知识:“阈值”说白了就是门槛的意思,也就是许多插件中的threshold参数。注意哦~一些文章中将threshold解释为“阀值”,其实根本没有所谓的“阀值”,“阀值”是“阈值”的错误写法,两个字长得很像哦。),即一个帧交错到了什么程度会被Postprocessing拉过来做Deinterlace 处理。

我们采用一个比较程式化的过程来设定postprocessing。首先,照下面来建立AVS脚本(注意,其他参数都是按照以前确定的,你应当按照刚才确定的order和guide的参数来设定):

LoadPlugin("E:\gk\AviSynthPlugins\DGDecode.dll")

LoadPlugin("E:\gk\AviSynthPlugins\Decomb.dll")

mpeg2source("F:\dvdrip-temp\soultaker.d2v")

Telecide(order=1,guide=1,post=3,vthresh=25,show=true)

用VDM 打开这个脚本然后播放影片,这时Decomb会在画面上显示vmetric值。该帧镇实际的vmetric值显示在方括号中的"chosen=",比如" [chosen=27]"。如果有vmetric值高于参数中指定的vthresh值,说明该帧被判断为交错,并交由Postorocessing处理。现在需要找出一个合适的vthresh值,能够从非交错帧里面辨别出交错帧。你能够很容易的辨别出被认为是交错的帧,因为a) vmetric 会大于vthresh,) progressive/interlaced 指示器会显示interlaced,c)整个帧会有一个白色的反交错(deinterlacing)动态图覆盖在上面。你绝不会错过它们的。

Vthresh 值的设定有一定难度,因此必须加倍小心谨慎。进行设定的原则是:宁愿捉到部分非交错帧都比放过交错帧好。不过虽说要尽量将交错帧尽量抓到,但一定要注意尺度,否则捕捉到过多的非交错帧,会造成画面模糊、显出杂色等等不良现象。如果抓到了过多的非交错帧,应当提高vthresh值;如果放过了部分交错帧,请减小vthresh值。这看起来很难,因为一部影片当中不同的部分动态、画面颜色等方面存在差别,所以一个vthresh值通常并不足够适应整部影片。好在Telecide支持更高端的Overriding Decomb Decisions模式,可以通

过自行编写脚本来为影片的不同段落应用不同的参数设定。因为这个模式很少用到且难以实际操作,所以以这里不作详细讲解,如果需要,请参看《Decomb参考手册》。

打开信息信息指示器(在参数中加入show=true),在VDM中多进行几段预览,确定得到较好的效果,不要留下漏网之鱼。

我们假设我们将vthresh设置成30的时候恰好能将交错、非交错帧区分开,现在将post 设置为2,我们的Telecide参数是下面的样子:

Telecide(order=1,guide=1,post=2,vthresh=30)

Blend参数:(范围:true/false,默认为false)

blend,混合,在Deinterlace的时候,用奇偶平均的方法,混合奇偶两个图场,可以减少突兀的交错现象,是去交错的方法之一。副作用,一是画面变模糊,清晰度下降,二是两张不同的画面混合在一起,看起来像是两个影像重迭在一起,会有残影,或者叫“鬼影”的现象。对比请看下面两幅图:

经由Blend得到的带鬼影的画面

经由场匹配得到的画面

当Blend为true时,Telecide就会像上面说的那样队两个厂进行混合后输出;如果为false,那么Telecide会保留一个场,然后使用内插补点补出另一个场。就速度来说,Blend比内插补点慢一些。

Back参数(范围:0~2,默认0)、bthresh参数(范围:0.0~255.0,默认50):

Back 参数控制着Telecide的反向匹配功能。什么叫反向匹配呢?在前面讲解场匹配的时候我们提到过,Telecide会分别用本帧的一个场和下面一帧的场进行场匹配。在这里,如果开启了反向匹配功能,那么Telecide在进行场匹配的时候,不但会与下一帧匹配,还会与上一帧进行匹配。

以3:2 pulldown 的片源为例

第3 个Frame 经过Decomb 重新组合,会变成

Bt

Cb

Bt

Cb

Ct

Cb <- 中奖,这个组合奇偶差异最小

输出差异最小的组合

当设定Back=0时,反向匹配会被禁用。就是说,如果遇到了剪切不良的影片,Telecide 找到合适的场进行匹配的几率会变小。没有成功匹配的帧会经过postprocessing的deinterlace 处理,这样得到的效果就不如场匹配得到无交错帧的效果好。

当设定Back=1的时候,如果一个帧经过场匹配之后,仍然存在交错,那么反向匹配就会启动,与前面一个帧的场进行匹配。Back=1需要与postprocessing配合使用,因此为取得较好的效果,开启back=1的时候请不要关闭postprocessing。在这里,Bthresh 参数用来指定反向匹配的阈值,即在正向匹配中,候选的匹配方案存在交错,到什么程度后会启动反向搜寻。该参数可与vthresh参数灵活搭配使用,我们可以使用较高的vthresh来处理场匹配失败的帧,搭配较低的bthresh值来处理剪切不良的地方。

当设定back=2的时候,反向搜寻会一直开启。但是对于back=2,请慎重使用,因为这可能会造成影片顿挫感(播放起来一顿一顿的,画面不流畅)。

在讲解完Telecide函数之后,我们来讲解与之配合的Decimate函数。Decimate函数通常紧跟在Telecide函数后面,因为Telecide可以为紧跟在其后的Decimate函数传送信息,更有利于Decimate准确的判断并删除重复帧。

Decimate函数基本语法:

Decimate()

通常情况下,用下面写法便可应付绝大多数情况,比如纯3:2 pulldown型:Telecide(order=1,guide=1,post=2,vthresh=30). Decimate(cycle=5)

有一点请注意,即25fps的PAL片源不要使用Decimate删除帧,因为这类片源根本没有重复帧。如果删了,就会造成画面播放的时候一顿一顿的。

为了应付更复杂的情况,我们来了解一下Decimate函数的常用参数。

Cycle参数:(范围:2~25,默认5)

Cycle参数用来指定删除重复帧的“周期”,即每多少帧删除一帧。比如,在3:2 pulldown 的片源下,我们需要每5帧删除1帧(原因见本节开头,Telecide原理讲解部分),那么cycle 函数应当设置为5。

Mode参数:(范围:0~3,默认0)

Mode参数用于指定Decimate函数的具体删帧策略。

当设置mode=0时,Decimate函数将直接删除本周期内最相似的两个帧中的一个,影片帧率将会随之下降。

当设置mode=1时,Decimate将会采用两种策略来应对:

1. 用一个内插补点计算出来的帧,来替换原本应该删除的帧,保持帧率不变。这个用内插补点计算出来的新的帧,由当前帧和下一帧计算得出。比如,经过场匹配处理的12345五幅画面,3、4相同,本来应当删去4,但是这时候Decimate就会通过3和5计算出来一个中间帧,取代4的位置。这时,仍然有5幅画面,所以帧率保持不变。

2. 保持该帧原有的样子不变,直接pass。比如,原有12345五幅画面,3、4相同,本

应当删去4,但此时Decimate会保持4不变直接输出。

到底使用哪种策略,又由两个方面决定:

1. 片源是否为3:2 pulldown?(需要在Telecide函数中使用post=1参数声明帧序)

2. 该帧与前一帧的区别?(通过本函数的threshold参数指定)

设置mode=3能够较好的应付24p/30i hybird这片源。Decimate会应用以下两种应对策略:

1. 当处理24p部分的时候,Decimate会按照正常的删帧方式,每5帧删1帧,帧率下降到24fps。比如经过场匹配处理的12345五幅画面,3、4相同,Decimate会删除4,此时帧率下降到24fps。

2. 当处理30i部分的时候,因为五幅画面中没有任何两幅相同,不能直接删除,同时还要求将帧率下降到24fps,所以Decimate会将5帧中最相近的两帧混合成1帧输出,以减少帧率下降所造成的顿挫感(画面一顿一顿的感觉)。比如经过Deinterlace处理的12345五幅画面,没有相同的,但是3、4两幅画面很相似,此时Decimate会将3、4混合成1帧输出,此时帧率下降到24fps。

Decimate的重点便是mode的采用。在通常情况下,纯3:2 pulldown(即纯24p)的影片最适合采用mode=0,这样处理得到的画面是最完美的,由于删除了本来就不该有的多余帧,所以没有顿挫感。

但是大多数情况是,没有纯3:2 pulldown的影片,很多影片为24p/30i混合的。mode=1和mode=3都是为了这种情况准备的。我们知道,24p部分每5张有一张重复,如果不删除这张重复的,画面播放的时候会一顿一顿的;30i部分没有重复画面,如果删了的话,画面会一顿一顿的。但是问题是,我们的片源里面既有24p也有30i,到底是删还是不删呢……这取决于24p和30i的含量。

1. 当影片大部分为24p,少数为30i的时候,应当采用mode=3。这样,24p部分被完美还原,30i的部分进行混合输出处理,缓解了由删帧引起的顿挫感。

2. 当影片大部分为30i,少数为24p的时候,应当采用mode=1。这样,30i部分因为没有删帧,没有顿挫感;24p部分由于采用了内插补帧的方式增加了一帧,缓解了不删帧引起的顿挫感。

有一点请注意,用Telecide+Decomb处理24/30 hybird混合型片源,最多只能算作一种妥协方案。这样做出来的DVDRip,画面可能会出现模糊、顿挫感、色块(由内插补点或者Blend 引起)等等不良现象。处理24/30 hybird混合型片源最佳的解决方案是制作120fps的AVI。Decimate函数的重要参数到这里就基本讲完了。如果想了解更多Decimate的进阶参数,请参考《Decomb参考手册》。

下面来讲解FieldDeinterlace函数。FieldDeinterlace与Telecide的Postprocessing机能非常类似,都是对出现交错的单个帧进行去交错。

相关主题
相关文档
最新文档