AviSynth入门与应用指南

前言
    AVS在DVDRip制作中是至关重要的一个步骤,直接影响到画质好坏。因此,AVS也是无数Ripper花大力气研究的对象。 
    当积累了一定经验和熟练度之后,创建AVS脚本是一件相当有乐趣且轻松的事情。有经验的Ripper看到片源之后,立刻就可以基本确定需要使用那些滤镜、怎样搭配滤镜参数,之后,只要进行细微的调整,便可得到希望的效果。新手成为老手,需要一个积累经验的过程,除了多看别人的心得、遇到问题勤于提出之外,就只剩下自己多做片、积累实战经验。经验的积累是一个较长的过程,因此不要梦想阅读了某篇文章后一夜之间成为所谓高手,经验不会骗人,因此脚踏实地才是正确的道路。 
    提高AVS运用水平的两条小经验: 
    1. 英语要好,因为大多数滤镜的文档都是E文的,且很少有中文翻译版; 
    2. 善于使用各种搜索引擎,比如GOOGLE、一些论坛的搜索引擎等。 
    3. 善于提问。在提出问题之前,看看说明、用搜索引擎搜索一下,这样一来,应该说85%的问题都能够很好的解决。这样不但为别人省去了麻烦,而且这样学来的知识最牢固。 
第一章 AviSynth简介
    AviSynth是AVI synthesizer的缩写,也经常称之为avs,简单来说就是AVI合成器。是一个Frameserver。(Frameserver就是一个把影像文件从一个程序转换到另外一个程序的过程, 其间没有临时文件或中介文件产生)。
    AviSynth是由Ben Rudiak-Gould首创的一种非常有用的工具,能够提供各种方式来处理影像文件。最独特的就是AviSynth并不是一个独立的影像处理程序,而是在影像文件和影像处理软件之间担任“桥梁”的角色。这座桥梁不是简单的独木桥、而是有栏杆、有台阶(比喻其提供的大量虑镜)。因此比较灵活!如对于压制real格式来说,源媒体文件是vob、d2v(DVD处理过程中的中间文件)、ac3、mp3、avi、DAT/mpge等,而应用程序是各种real压缩软件如Helix real producer、BatchRealProducer144和EasyRealProducer14,它们都支持avs的导入。当然avs并不只是用于real压缩,只要avs支持你所需要处理的媒体文件,影像处理软件也支持导入avs文件,你都可以通过avs对视频进行处理,然后让影像处理软件输出你所需要的格式的文件。
    也许你还是不明白AviSynth能做什么,举些简单的例子:你需要对一段avi进行处理,你想把画面尺寸缩小,你可以用avs;你想把画面上的杂点消除,你可以用avs;你想把画面处理得锐利些,你还是可以用avs;AviSynth是桥梁,位于媒体文件和压缩软件之间,压缩软件可以通过AviSynth调用和处理媒体文件。而且不仅仅是压缩软件,甚至是播放器也能调用avs,对播放的文件进行处理,得要需要的播放效果。
    AviSynth现在有3个版本,第一个是Ben Rudiak-Gould的首先编译的AviSynth v1.0b;在Ben Rudiak-Gould停止开发后,Edwin van Eggelen继续开发,其版本是AviSynth v1.0b6;在2002年7月第二次源码编写计划开始,目前最新的版本是AviSynth 2.5.7,增加了YV12的支持,增加了许多实用的命令,也吸收了一些优秀的第三方滤镜成为内建滤镜,强力推荐使用。期待下一个版本更加完美!
    AviSynth的基本工作原理:
    AviSynth首先要编写建立一个包含特定命令的文本。称之为“脚本”(后缀为avs),这些命令指定要运行处理的影像文件和滤镜;然后运行影像应用程序,比如VirtualDubMod或NanDub,打开脚本。此时AviSynth就开始工作了,打开脚本中指定的影像文件,运行特定的滤镜,并把输出结果提供给影像应用程序。但影像应用程序并不了解AviSynth在后台所做的处理,而认为是直接打开了一个“被处理过”的影像文件。注意这里的文本,简单的说就是windows的写字板写出来的文件,你可以用任何一种文本编辑器打开进行编辑。这一特定命令的文本称之为"脚本"(文件后缀名为avs),这些命令指定要运行处理的媒体文件和滤镜! 
使用AviSynth有5大优势:
    1. YUV支持:内建滤镜可以在YUV环境下运行,第三方滤镜几乎也兼容YUV,所以比起VD、ND的内嵌滤镜必须在RGB环境下运行要快很多。省却了一个转换的过程,将来还可以支持YV。 
    2. 滤镜处理:内建许多影像处理滤镜,比如Resizing,Cropping等。还有大量的第三方强力滤镜,并可以调用VD以及AviUtl的第三方滤镜。
    3. 突破2G限制:通过AviSynth打开影像文件就相当于应用程序直接打开,这样就可以使本身有2G限制的程序也能突破2G的限制。
    4. 打开格式:AviSynth可以打开几乎所有影像文件,包括MPEG和QuickTime。所以当影像应用程序通过AviSynth打开这些文件时,会被认为是打开标准的AVI,这样就可以处理影像应用程序本身并不支持的格式。
    5. 节省硬盘空间:AviSynth处理的影像文件在运行过程中直接导入应用程序,没有临时文件,所以节省硬盘空间。
安装
    1、对于AviSynth 2.05或以前的版本,安装的时候先解压缩,AviSynth.dll复制到Windows\System下(W98,ME)或Windows\System32下(W2K,XP),然后运行INSTALL.REG就完成安装了;
    2、对于AviSynth 2.06以后的版本包括最新的AviSynth 2.5.8 Alpha (070518),直接运行解压的EXE文件即可自动安装,不过要事先卸载安装过的AviSynth程序。
    3、把需要的滤镜解压缩到plugin文件夹下。
第二章 AVS语法及基本应用技巧
    既然要编写脚本,就要知道怎么写。在本章中,我们结合实例来了解一下AVS脚本的基本语法。只有懂得了写法,才能更好的运用。 
    AVS脚本的语法非常类似于C语言的语法,但比C要简单得多。如果你有一定的C语言(或以C为基础的脚本语言,如PHP)的编写经验,那么你会发现AVS竟然是如此的简单——你甚至可以跳过本章直接进行下章的内容。
    下面我们先来了解几个概念:
    函数——函数的英文名字叫function,这个词在英文中还有“功能”意思,没错!AVS中绝大部分的功能都是通过各种各样的函数来实现的。AVS中的函数按调用方式分为两类,一种是内置函数,一种是外挂函数。
    内置滤镜(又可称做“函数”)已经放置在AviSynth软件内部,可以在脚本中直接调用;外挂函数不包含于AviSynth中,需要在脚本中额外加载相应的DLL文件或其他AVS脚本函数才能调用。AVS包含的众多内置滤镜我们将会专门抽出一章来介绍。 
    外置滤镜(又可称做“函数”)可以在网上下载得到。正是因为这点,AVS被赋予了几乎无限的扩展性,我们可以通过在网上找到各种函数来实现五花八门的功能。忘记说了,有些人喜欢管“函数”叫做“滤镜(filter)”或“插件(plugin)”,实际上这么叫也是正确的,就连AVS的众多官方文档都称之为滤镜、插件。但是就笔者个人来说,更愿意叫“函数”,因为这些“滤镜”的使用方式是函数的f(x)的形式。 
    参数——既然有函数,就要说参数。如果说函数是实现某样功能用的,那么参数就是告诉函数通过什么方式实现、实现到什么程度等等的信息。上面说的f(x)的调用形式,f是函数名称,x就是参数。有的函数一个参数就够了,有的函数却要很多参数,四个、五个、十多个。比如Telecide这个函数如果把所有的参数加起来一共有十四个之多。好在不是所有的参数都是必要的。有些参数可以写也可以不写。如果不写,函数就会自动使用其内部的默认值。但是,如果必写的参数不写,那么函数就无法启动。
    变量——变量可以简单的理解成某个对象的名字(实际上要复杂一些)。比如,我们规定“本文作者=大虾”,那么当我们提到“本文作者”的时候,我们的第一反应就是那个叫“大虾”的家伙。
    好了,下面我们借个一段极其简单的范例来了解一下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读到这句话的时候,一看到这句话前面有“#”,就会无视它,继续读到下一行。编写脚本写注释是一个好习惯,尤其是极其复杂的脚本。这种情况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脚本的写法
例如Crop切边,语法是
Crop(clip, int left, int top, int width, int height, bool align) 
clip就是源
使用的时候可以写
Video=Crop(Video,8,0,704,480)
也可以写
Crop(8,0,704,480)
但是两种写法是有区别的具体的可以比较下面的两个例子
# PLUGINS
LoadPlugin("C:\PROGRA~1\Autorv9\SOFTS\AVSFILE\MPEG2DEC3.DLL")
# VIDEO SOURCE
Video=Mpeg2Source("E:\a.d2v")
# CROPPING
Video=Crop(Video,8,0,704,480)
# RESIZING
Video=BicubicResize(Video,640,480,0,0.5)
# FINISH
Return(Video)
# PLUGINS
LoadPlugin("C:\PROGRA~1\Autorv9\SOFTS\AVSFILE\MPEG2DEC3.DLL")
# VIDEO SOURCE
Mpeg2Source("E:\a.d2v")
# CROPPING
Crop(8,0,704,480)
# RESIZING
BicubicResize(640,480,0,0.5)
也就是说如果你制定了源Video,那么你就要注意了必须要调用源的地方都要写上源,最后还要Return(Video)。两种写法不能混用哦。
下面介绍一些小花招,让我们的处理更加轻松。 
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").ConvertToYUY2() 
v1= ConvertToYUY2(v1) 
v2=avisource("C:\2.avi").ConvertToYUY2() 
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常用滤镜介绍 
AviSynth内建了数目繁多的滤镜,所以只能介绍一些最常见最实用的,滤镜可以理解为各种处理视频的工具。 
AviSynth滤镜的安装:在http://www.avisynth.org/warpenterprises/files/可以下载到滤镜,解压缩后将虑镜插件dll文件拷贝到安装目录的plugin目录里。
一、加载插件
1.LoadPlugin() 加载插件
如: 
LoadPlugin("VSFilter.dll") 加载字幕插件
LoadPlugin("mpeg2dec3.dll") 加载DVD的mpeg2编码器插件
LoadPlugin("mpasource.dll") 加载mp3插件
请下载以上提到的滤镜!并解压制到plugin目录里(当然目录可以自己选定),如果avs文件和滤镜不再同一个目录下,记得要把加载滤镜的路径名写全了。有些滤镜或者脚本是avisynth核心的滤镜或脚本,也就是avisynth本身提供的功能,这些就不需要加载,其它的都需要加载。你也可以用SetWorkingDir设定插件文件的工作路径
2. SetWorkingDir()  指定插件路径
SetWorkingDir("d:\GORDIA~1\")  # 设定AVS 脚本调用dll 插件文件的工作路径
这样设置好后,就可以在下面直接写调用语句了,不需要再一个一个的写滤镜的路径了,但前提是.dll的滤镜文件已经复制到设置的文件夹下了。
例:SetWorkingDir("D:\AviSynth 2.5\plugins\") #设置滤镜的目录
LoadPlugin("VSFilter.dll") #调用字幕滤镜插件
二、源媒体读取
1.DirectShowSource()  万能调用
如:DirectShowSource("e:\vob\ss.VOB") 
DirectShowSource()在高版本avisnyth中显得更万能些,常用的媒体格式,如avi、mpge1/dat、mpge2/vob/bin都可以加载,另外可以不用分离视频和音频,而直接压缩!想要直接压制vob请使用高版本的avisynth,如目前的2.54 。如果遇到打不开的媒体格式你大都可以试试看DirectShowSource。
2.AVISource()  avi文件调用
如:AVISource(e:\avi\1.avi,false) 
用于导入AVI格式的影片,需要安装相应的Codec才能导入。这个对于DVDRIP压制者来说可能更常用些.false表示禁止音频! 
3.mpeg2source()  这个用于解码DVD的mpeg2格式的视频
mpeg2source("XXX.d2v")
4.WAVSource("e:\vob\ss.wav")  #读取wave音频 
5.AC3SOUECE("e:\vob\ss.ac3")  #读取ac3音频 
6.MPASOURCE("e:\vob\ss.MP3")  #读取mp3音频 
注:WAVSOURCE和AVISOURCE是属于核心脚本,无须读取插件,但AC3SOURCE和MPASOURCE需要读取AC3SOURCE和MPASOURCE插件。DirectShowSource的读取需要安装各种音频和视频的解码器。
7.convertfps=true
这个要特别说明一下,convertfps=true语句的作用是防止转换可变桢率的RMVB和WMV时出现影音不同步。rmvb/wmv都是是浮动帧率,如果你指定帧率反而会不同步,所以不要指定fps这个数值。载入行要这么写
directshowsource(“文件路径全名”,convertfps=true)
三、crop()、LanczosResize()裁黑边和调整大小
1.LanczosResize()
缩放滤镜:LanczosResize是BicubicResize的替代者,提供更精准、更锐利的画质。在日本普遍使用LanczosResize,欧美大多使用BicubicResize。本来是日本人开发的第三方滤镜,自AviSynth 2.05版本开始吸收为内置滤镜。 
例:LanczosResize(640,480)  #把分辨率改变为640*480
2.SimpleResize()  外置滤镜
    放大缩小:由trbarry编写的,由于对SSE进行了优化,所以速度快,效果好。替代了AviSynth中的BilinearResize。和LanczosResize的米切尔双立方体算法不同,这个是单纯的双线性算法。LanczosResize的画质更锐利和真实,适合普通电影;而SimpleResize的画质较柔和,适合动画。
例:LoadPlugin("SimpleResize.dll")
SimpleResize(640,480) #作用与LanczosResize和BicubicResize是一样的。
2.Crop()
切边:为了保持比例或切除黑边,参数是整数,顺序是左、上、宽、高。 
例:Crop(8,0,704,480)  #左右各切去8像素。
vob文件画面大小一般720×480。16:9宽银幕的都带了很大的黑边,需要裁减掉。也是avs用于vob压制的关键因素之一。裁减黑边和缩放画面是vob文件压制中很重要的因素,一般连用。对于本身就无黑边的文件直接用LanczosResize() 
16:9画面的有2种情况,请记住这几个数值,在rmvb压制中直接套用即可! 
DVD变形宽银幕:640×352,608×336 
电影宽银幕: 640×272 
如要将电影宽银幕的画面比列调整到640×272,avs里可以这么写 
Crop(8,90,704,300) 
LanczosResize(640,272) 
如要将DVD变形宽银幕的画面比列调整到608×336,avs里可以这么写 
Crop(8,64,704,352) 
LanczosResize(608,336) 
无黑边的画面的直接用 
LanczosResize(512,384) 缩小同时画面强制到标准4:3 
请直接记住这几句就可以了得到最佳的rmvb画面大小了!
3.AddBorders()
加边:给影像加黑边。参数是整数,顺序是左、上、右、下。 
例:AddBorders(0,64,0,64)  #就是给图像上下各加64像素的黑边
有的文章中讲这个滤镜似乎并不常用,但是我在做硬字幕的影片中常用这个滤镜把字幕加到黑边处,在欣赏影片的同时不至于失去影片画面的完整性。
四、亮度滤镜 
亮度滤镜是使用avs压制vob-rmvb vcd-rmvb的又一关键因素。画面太暗的rmvb是失败之作。下面介绍2个:
1.Levels()
层次:调节亮度、对比度和Gamma值。 
例1:Levels(0,1.2,255,0,255)  #调整Gamma,使画面变亮
例2:Levels(0,1.5,255,0,255) 
改第二个,我感觉数值在1.3-2之间比较合适,一般1.5比较合适 
2.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。
例:Tweak(0,1,20,1) 
4个浮点数分别表示:调节色度,饱和度,亮度,对比度。一般将第三个调节在0-30之间,以15-20为宜。
个人感觉level()比较好,主要调背景为主,而vob文件主要是背景暗。注意Tweak的其他调节可能和颜色控制环境有关,如YUY2,因此其它的最好不要再改动。
五、编辑滤镜
1.FadeIn ()淡入和 FadeOut()淡出
淡入和淡出:提供淡入和淡出功能,尤其是淡出功能,可以使影片结束地更自然。参数为整数,表示需要编辑的帧数。 
例:FadeOut(24)  #影片最后24帧淡出 
2.Trim()
截取:可以截取某段影片。参数为整数,表示需要编辑的开始帧和结束帧。 
例:Trim(240,480)  #截取240~480帧这一片断
六、声音滤镜
1.AudioDub()
影音合并:可以把影像和声音合并在一起。
AudioDub(video, audio)
下面是一个简单的实例:
Video =AVISOURCE(“xxx.avi”,FALSE,“YUY2”) 
Audio= WAVSOURCE(“xxx.wav”) 
AudioDub(Video,Audio) # 把test.avi和test.wav合并
合成常用于real格式的压制,制作rmvb的时候就需要把视频和音频合成后交给real压缩软件,而制作avi则不需要合成视音频。这主要是因为real格式要求视音频都必须用real压缩,而avi则可以使用多种音频格式,一般是单独压缩视频,然后再用其他软件合成视频音频。合成在rmvb压制方面的例子可以参考后面的rmvb压制部分
2.GetLeftChannel() 和 GetRightChannel()
获取声道:把立体声的左右声道单独返回,适用于左右声道不同语种的WAV。 
例:stereo=WavSource("test.wav") 
  return GetLeftChannel(stereo) 
返回test.wav的左声道 
3.DelayAudio()
声音延迟:由于从VOB里分离的AC3通常有延迟,所以用Azid转码得到的WAV也有延迟,在用AudioDub合并时就需要加上这个延迟。 
例:写法①WavSource("test.wav").DelayAuido(0.5) # 把test.wav延迟半秒
    写法②DelayAudio(wavsource(”XXX.WAV“),-30)30的单位是毫秒,经典的解决音画同步问题。
4.ResampleAudio()
音频重新采样
例:WAVSOURCE(“xxx.wav”).ResampleAudio(48000) #音频重新采样,采样率48000
5.AmplifydB()
左右声道的放大减小
AmplifydB(wavsource(“xxx.wav”),3,3) #左右声道放大3DB
6.Mergechannels()
组合左声道、右声道
例:Left=wavSource("C:\1.wav").getleftchannel 
Right=wavsource("C:\2.wav").getrightchannel 
mergechannels(Left,Right)
七、字幕滤镜 
1.VobSub()
    Sub字幕:VobSub不但是外挂字幕的好手,内嵌字幕也是一样的强。
    将字幕的2个文件test.idx和test.sub放在同一个目录下就可以了。
例:LoadPlugin("VobSub.dll")
VobSub("test") 
也可以这样VobSub("e:\vob\ test.idx")  #加载影片字幕
2.TextSub()
    SSA和ASS字幕:这个也是VobSub自带的,可以内嵌特效字幕。
例:LoadPlugin("TextSub.vdf")
TextSub("h:\avs\jrvs.ssa")  #加载水印文本
例2:LoadPlugin("VSFilter.dll")
TextSub("F:\DVD\js60\js601.srt")  #加载srt字幕
需要调用字幕滤镜LoadPlugin("VSFilter.dll")
八、色彩模式的转换 
有些压缩软件不支持某些色彩模式,例如默认情况下Helix不能在YV12环境下工作,需要将DVD的YV12转为YUY2 
video=ConvertToYUY2(video),当然如果你装了Xvid,Helix也是可以在YV12下工作的
有如下的转换: 
ConvertToRGB32()、ConvertToRGB24、ConvertToRGB() 
ConvertToYUY2()、ConvertToYV12() 
简单例子: 
AVISOURCE(“xxx.avi”) 
ConvertToYUY2() 
等价于AVISOURCE(“xxx.avi”,“YUY2”)或者AVISOURCE(“xxx.avi”).ConvertToYUY2()其他的也类似
九、其它虑镜介绍
1.截图
没有想到用avs来截图吧,只要用wmp6.4或mpc6468播放一下写好的avs文件,截图就产生了。
directshowsource("C:\1.rmvb",fps=23.976).ConvertToRGB24 
trim(0,19) 
ImageWriter("C:\",0,0,"jpg") 
这里我们假设的是要截取的rmvb为C:\的1.rmvb,要截取的frame(幅)从第1到20共20幅(trim是以0为第一幅) ,保存路径为C:\,格式为jpg(支持bmp, dds,jpg/jpe/jpeg, pal, pcx格式)
连续截图
例:Avisource("C:\test,avi",false).ConvertToRGB24 
trim(0,19) 
ImageWriter("C:\",0,0,"jpg") 
截取特定的frame
例:Avisource("C:\test,avi",false).ConvertToRGB24 
trim(1920,1920) 
ImageWriter("C:\",0,0,"jpg")
2.
1.
在rmvb压制中不推荐使用,如部分朋友选用的
FluxSmooth(5,7) #柔化滤镜 
Convolution3d("moviehq")  #3D优化滤镜
2者需要加载相应的滤镜插件
2.常见的外置滤镜
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非常灵活,要按具体情况具体分析。
    实例一:截边和改变分辨率
    实例二:合并输出
    实例三:加载一个720p的HDTV电影
    实例四:两段视频合为一段
    实例五:压制DVD
实例一:截边和改变分辨率
Avisource("H:\xx.avi").crop(5,20,630,440).lanczosresize(640,352)
Corp与lanczosresize两者顺序不能变。
Corp切黑边,想把一个640X480分辨率的片源,左右各切去5,上下各切去20.数值为(5,20,630,440)<左,上,右,下>.
Lanczosresize改变分辨率.(宽,高)
压RMVB如要改小分辨率的话建议:704X396的片源用576X324---640X480的片源用512X384的。尤其是DVD转RMVB,通常拷贝出来的VOB都带有大片黑边.一定要切了去否则压时浪费码率。
另外比较保险的分辨有640X352,640X272
切边的话可以用Easy Realmedia Producer(简称:ERP)里面的功能,方便一些;或者是用gk里的功能,可以计算失真。
用ERP打开片源>参数设置>设置裁切区域>手动调节。然后用鼠标拖动红色边框,Inpug Preview为预览。
实例二:合并输出
v1=trim(avisource("H:\RAW\武器\9.avi",false).changefps(23.976),0,767)
trim表示截取一段视频。
v1=trim(avisource("H:\RAW\武器\9.avi",false).changefps(23.976),0,767)
读取片源,false关闭音频。通常After Effects做的特效都是无声的,所以要关闭片源音频。changeFPS(23.976)强制显示帧数。合并的前提必需帧数统一,0,767)截取的帧数.这个可以用VDM查看。
v2=trim(avisource("H:\字幕存储\武器\op.avi",false).changefps(23.976),0,226)
这个是AE做的特效.事先用VDM得知为226帧.
v3=trim(avisource("H:\RAW\武器\0.avi",false).changefps(23.976),994,0)
这三个语句分别是截取了片源0-767帧,截取了AE特效的全部帧,截取了片源的994-最后的帧数.即是说切去的片源的中间一段,并用AE特效代替.
a=v1+v2+v3
将这三部分拼合起来
return a.textsub("H:\09.ass").textsub("H:\武器op09.ass")
最终输出并加挂字幕.
有时两个片源分辨率不一样,此时还要统一分辨率.
v1=trim(avisource("H:\RAW\wuqi\9.avi",false).changefps(23.976).lanczosresize(704,396),0,767)
最终输出的结果是没有声音的.AVI内嵌时用.
RMVB内嵌直接加挂音频就可以了.
loadplugin("H:\plugin\mpasource.dll")
读取mpasource.dll插件(加载MP3音频)
v4=mpasource("H:\wav\武器\09.mp3")
加载MP3音频.
audiodub(a,v4)
合并视频与音频.
另:这样子加载上的音频.在压RMVB时,音频设置最好不用RA10 PLUS。之前用RA10 PLUS. 48Kbps压出来的几个片子音频头1两分钟都无音的…RA8没问题.
120帧的片源的截切。
要先用AVS强制显示23.976帧。然后用VDM打开看帧序号。合并时AE特效也要同样用这个帧率。
AVS切广告+合并AE特效。
国为牵扯到音频,所以得先处理音频。
比如,0-100帧是AE特效,无声。300-350是广告
切了广告的部分再合并AE特效,视频部分就完成了。
因为AE特效是无声的,音频就要另写一个脚本来提取。即将原片源的广告切除的脚本,不禁声音。然后用VDM打开,保存WAV音频。
120帧的片源的压缩。
直接强制帧数:changefps(23.976)
另一个是:selectevety(5,0)
实例三:加载一个720p的HDTV电影
这就是一个完整的AVS文件。
SetWorkingDir("C:\Program Files\GordianKnot\AviSynthPlugins\")
LoadPlugin("decomb.dll") 
LoadPlugin("VSFilter.dll") 
LoadPlugin("UnDot.dll")
LoadPlugin("Convolution3D.dll")
directshowsource("F:\HDTV\Heroes\test.mkv")
textsub("F:\HDTV\Heroes\test.ass")
lanczos4resize(480,272) 
Levels(0,1.3,255,0,255)
Convolution3d("movieHQ") 
Tweak(0,1,15,1) 
sharpen(0.3) 
undot()
AmplifydB(30,30,30)
实例说明:
#载入DLL
SetWorkingDir("C:\Program Files\GordianKnot\AviSynthPlugins\")  #指定了滤镜的路径
LoadPlugin("decomb.dll")  #调用decomb.dll滤镜
LoadPlugin("VSFilter.dll") #调用VSFilter.dll滤镜
LoadPlugin("UnDot.dll")  #调用UnDot.dll滤镜
LoadPlugin("Convolution3D.dll")#调用Convolution3D.dll滤镜
第一行中指定了滤镜路径以后,下面再调用滤镜文件夹下的滤镜时就可以直接用loadplugin调用了,就不用在括号里写入路径。这仅限于指定文件夹下有的滤镜,没有的滤镜仍需要写出完整路径。
#片源处理:加黑边,加电影字幕
directshowsource("F:\HDTV\Heroes\test.mkv") 调用片源
textsub("F:\HDTV\Heroes\test.ass") 调用片源字幕(sub,inx字幕用VobSub滤镜,aas,ssa,srt等别的字幕字幕用TextSub滤镜)
#改变视频大小
lanczos4resize(480,272) (480,272)是16:9的标准模式
#调整视频滤镜
Levels(0,1.3,255,0,255) 背景亮度加强1.3
Convolution3d("movieHQ") 3D柔化滤镜,大视频转成小视频,这个东西很有效果!
Tweak(0,1,15,1) 增强亮度15
sharpen(0.3) 锐化,在iphone上看更加清楚
undot() 消除噪点
#调整声音滤镜
AmplifydB(30,30,30)  #左中右声音各加强30DB
实例四:两段视频合为一段
这也是一个完整的AVS文件
LoadPlugin("VSFilter.dll")
b=directshowSource("e:\avs\cd1.avi").TextSub("e:\BBSLogo\logo.ssa").VobSub("e:\avs\cd1.idx")
c=directshowsource("e:\avs\cd2.avi").VobSub("e:\avs\cd2.idx") 
final=b+c 
return final 
说明一下
LoadPlugin("VSFilter.dll")  #调用字幕滤镜
b=directshowSource("e:\avs\cd1.avi").TextSub("e:\BBSLogo\logo.ssa").VobSub("e:\avs\cd1.idx")
B段为CD1.avi,加上了水印logo.ssa,加上了DVD字幕cd1.idx,大家可以自行在这段中加上一些参数。格式为:参数+.+参数+.+参数+……….
例:
directshowSource("e:\cd1.avi").TextSub("e:\logo.ssa").VobSub("e:\cd1.idx").lanczos4resize(480,272). Levels(0,1.3,255,0,255). Tweak(0,1,15,1).
看明白了吧,中间间隔符号为小数点“.”
c=directshowsource("e:\avs\cd2.avi").VobSub("e:\avs\cd2.idx") 
C段为CD2.avi,加上了字幕,没加水印
final=b+c 
影片为B段+C段
return final 结束语,没有实际含义
可以在一定程度上解决单CD码率过度错位。如分别1pass压制CD1和CD2可能会由于码率错位太大而使文件增大,但如果2个一起压制,则可能由于码率补偿,平均码率错位反而不大,而使文件大小减小。
实例五:压制DVD
下面针对DVD的压缩介绍一下avs运用。对于压制DVD,我们一般已经用DVD Decrypter将DVD抓取出来,并且用DVD2AVI分离了DVD的视音频,得到视频的临时文件*.d2v和音频文件*.ac3等。压制DVD的avs脚本除了上面的常用滤镜和脚本外,还有一些自己特别的地方。
SetWorkingDir("d:\GORDIA~1\") # 设定AVS 脚本调用dll 插件文件的工作路径
LoadPlugin("mpeg2dec3.dll") # 调用DVD的mpeg2编码器插件
LoadPlugin("decomb.dll") # 调用交错滤镜插件,包含了IVTC 和Deinterlace 两种滤镜
LoadPlugin("TomsMoComp.dll") # 调用交错滤镜插件,对应Deinterlace 滤镜中的TomsMoComp 脚本命令
LoadPlugin("SimpleResize.dll") # 调用变形滤镜插件,对应SimpleResize 脚本命令
mpeg2source("F:\temp1\1.d2v") # 源d2v 文件的路径
trim(startframe,endframe) # 截取VOB 片断进行压缩。startframe 为起始帧,endframe 为结束帧。主要用于片断测试
压缩或更高级的分段处理压缩
Telecide(guide=1) # IVTC 滤镜。多用于做NTSC 制式DVD 的IVTC 处理
Decimate(Cycle=5) # IVTC 滤镜。用于NTSC 制式DVD 删除重复帧处理,即 29.970fps --> 23.976fps
FieldDeinterlace() # Deinterlace 滤镜。用于做PAL 制式DVD 的Deinterlace 处理,不能同IVTC 和TomsMoComp
滤镜同时使用
FieldDeinterlace(blend=false) # 同上
TomsMoComp(1,5,1) # Deinterlace 滤镜。在处理PAL 制式DVD 时,一般不能同FieldDeinterlace 和 Telecide 同时
使用
crop(14,8,-12,-12) # 裁切命令。参数为(左、上、右、下),代表各边被裁切去的象素值
LanczosResize(640,352) # 变形滤镜。确定最终AVI 的分辨率,常用于普通电影
SimpleResize(640,352) # 变形滤镜。确定最终AVI 的分辨率,常用于二维动画,不能和LanczosResize 同时使用
SelectRangeEvery(xxx,14) # 全片平均采样测试语句。其中xxx 主要用于 COMPRESSIBILITY CHECK 测试,即
(2pass/1pass)*100% 预测算,而正式压缩时不用。其中xxx 为平均采样点的间隔值。例如当
进行全片 5% 预测,则xxx=280,10%为140,15%为93
压制DVD视频于处理一般avi有不少需要注意的地方。例如IVTC、切边、变形等,IVTC可以参考 IVTC技术原理、隔行与逐行之间;切边、变形可以参考 关于切边和变形
IVTC是其中比较重要的一环。根据检测DVD2AVI显示的VOB 的Video Type 和 Frame Type, 确定影片的 IVTC 或 Deinterlaced 处理方式”,
AVS 脚本命令的使用原则如下:
A、对于NTSC Interaced 型:需要做IVTC 和去重复帧处理,则AVS 脚本应包含 Telecide(guide=1) 和 Decimate(Cycle=5) 语句。
B、对于NTSC Progressive 型:不做任何处理,则AVS 脚本无需包含 IVTC 和 Deinterlace 滤镜。
C、对于PAL Progressive 型:不做任何处理,则AVS 脚本无需包含 Deinterlace 滤镜。
D、对于PAL Interlaced 型:需要做Deinterlace 处理,则AVS 脚本应包含 FieldDeinterlace() 或 FieldDeinterlace(blend=false) 或
TomsMoComp(1,5,1) 语句。
E、对于NTSC FILM 型:若为 纯FILM 或 FILM≥95% 时,则在DVD2AVI 阶段就已经过force film,这里就无需处理了; 若
FILM < 95% 时,需要做IVTC 处理,则AVS 脚本应包含 Telecide(guide=1) 和 Decimate(Cycle=5) 语句。
F、对于NTSC Interlaced / Progressive 混合型:全部做IVTC 处理,则AVS 脚本应包含
Telecide(guide=1,Gthresh=50,dthreshold=8,threshold=0,Post=true).Decimate(5) 语句。

你可能感兴趣的:(vi)