AVS全面学习

cam、ts、tc、scr版的区别
BeastWars 野兽战争 DVDrip 下载
英国修复版大电影DVDrip下载
ISO 14496-10(视频)-Advanced Video Coding(AVC) 简明介绍
AVS基础入门
RobotMasters机动战记DVDrip01下载
变形金刚Zone地带DVDrip下载
RID中文字幕DVDrip下载
关于DVDrip
DVDrip字幕全攻略
Shout! Factory出品25周年变形金刚DVD
从零开始认识蓝光技术与蓝光设备
25周年新版变形金刚G1动画DVD第一季外观
变形金刚2 堕落者的复仇DVD封面放出
变形金刚Energon超能量体DVD套装碟报
变形金刚Armada 第一季第二部分 Season One Part TWO
新加坡变形金刚爱好者网站建立
The Ark 方舟资料库II
Music Matrix 音乐能源宝——变形金刚主题曲集
GalaxyForce音乐CD下载


作者:dgwxx    来源:ogg.cn    DVDrip制作    2006-3-16 18:02:51
  在本章中,我们来学习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.dll”这个插件。
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:\1.avi”)
Clip2=avisource(“d:\2.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:\1.avi").ConvertToYUY2()
v2=avisource("C:\2.avi").ConvertToYUY2()
……
  这样写等价于:
v1=avisource("C:\1.avi")
v1= ConvertToYUY2(v1)
v2=avisource("C:\2.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的常用内置函数。

第四节 复习: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机能非常类似,都是对出现交错的单个帧进行去交错。
FieldDeinterlace基本语法:
FieldDeinterlace()

Full参数:(范围:true/false,默认false)
  Full参数用于指定是否全部帧都是交错。当设置为true时,函数会对全部帧进行Deinterlace处理。当片源全部为交错帧的时候(比如纯30i),可以将full设置为true。当设置为false时,函数会对每个帧进行侦测,如果判断为交错帧,那么进行Deinterlace处理;如果不是交错帧就直接pass。
Blend参数:与Telecide的Blend参数相同。

  到此为止,Decomb的一些函数的基本参数已经基本讲解完了。本节只是对一些重点、基本参数进行了讲解,如果想了解更多,笔者强烈建议您参阅Decomb的《Decomb参考手册》。在这个手册里面,您将找到一切您需要的答案。

第六节 实战!Decomb做IVTC/Deinterlace处理
  在上一节中,我们讲解了Decomb中三个场处理函数的使用方法与参数。在本节中,我们将针对具体例子来讲解这三个函数的组合应用。
  首先我们来看纯Interlace片源的Deinterlace处理:
范例脚本:
LoadPlugin("decomb.dll")#加载Decomb滤镜
AVISource("nonfilm.avi")#导入片源
FieldDeinterlace()#使用FieldDeinterlace进行Deinterlace处理,全部参数均为默认。

  然后,我们来看看针对3:2 pulldown片源只反交错,不删除重复帧的处理:
LoadPlugin("decomb.dll")
AVISource("film.avi")
Telecide(order=1)#使用Telecide函数进行场匹配反交错

  接下来,我们来看看IVTC(在场匹配反交错的同时删除重复帧)的做法:
LoadPlugin("decomb.dll")
AVISource("film.avi")
Telecide(order=1)
Decimate(cycle=5)#用Decimate每五帧删一帧

  禁用Postprocessing:
LoadPlugin("decomb.dll")
AVISource("mixed.avi")
Telecide(order=1,post=0)#post=0为禁用Postprocessing
Decimate(cycle=5)

  对3:2 pulldown含量很大的影片进行IVTC:
LoadPlugin("decomb.dll")
AVISource("mixed.avi")
Telecide(order=1,guide=1)#使用guide=1对3:2 pulldown的片源处理进行优化
Decimate(cycle=5)

  处理hybird片源:
LoadPlugin("decomb.dll")
AVISource("hybrid.avi")
Telecide(order=1,guide=1)
Decimate(mode=3,threshold=2.0)#使用Decimate的mode参数对hybird影片的处理进行优化,
  具体配制方法请见上一节。

  IVTC的理论与实践到这里已经讲完了。希望读者能够反复阅读本章,本章中涉及到众多的词语,第一次读起来可能会比较吃力,但是读的次数多了之后自然会明白不少的。
作者:dgwxx    来源:ogg.cn
网站首页 | 文档列表 | 网站声明 | 友情链接 | 联系方式
Copyright © 2004-2008 TFcc. All Rights Reserved.
变形金刚形象使用权仅属于美国Hasbro®公司与日本Takara®公司