有间论坛

 找回密码
 立即注册
搜索
热搜: 电影 连续剧
查看: 5878|回复: 2

AviSynth使用指南

[复制链接]
发表于 2007-12-13 21:08:55 | 显示全部楼层 |阅读模式



1 开始

简单说来,AviSynth是这样工作的:首先,使用特定的命令形成一个简单的文本文档,称为脚本。这些命令和你要用的一个或多个视频或者滤镜有关。然后,运行一个视频处理程序,比如VirtualDub,并且用其打开这个脚本。这时候,AviSynth开始工作。它打开了你在脚本中使用的视频,运行了指定的滤镜,并且把结果输出给视频处理程序。然而,视频处理程序并不关心AviSynth在台后是如何工作的,它认为它只是直接打开了一个你硬盘上已经存在的过滤好了的一个AVI文件。

在AviSynth2中,有很多新的和再开发出来的功能。为了清楚的看到这些新功能(特别是当以前的版本中没有这些特点时),新功能将以v2标识。

2 视频编辑
2.1 线性编辑

你用AviSynth能做的最简单的事情就是你用VirtualDub也能做到的那种编辑工作。这样的脚本是很容易编写的,因为如果你不想用的话你可以不必去管那些变量和复杂的表达式。

可以做一个测试,把下面的一行文字写在一个文本文件中,保存为test.avs文件。

Version

现在用Windows Media Player打开这个文件(筝儿:其实用什么播放器打开都没关系啦),你会看到一个十秒钟的视频剪辑,显示了AviSynth的版本号和拷贝权信息。这里,Version称为“源滤镜”,意思是它产生了一个剪辑而不是更改了一个剪辑。AviSynth脚本的第一条命令一定是一个源滤镜。

现在在刚才生成的脚本文件中加入第二行,这样就变成了如下所示:

VersionReduceBy2

再次用Media Player打开这个脚本文件。你应该再次看到拷贝权信息,但是这次显示内容的大小只有原先的一半。
ReduceBy2称为“变形滤镜”,意思是他作用于前一个剪辑并且对它作某种方式的变形处理。你可以连续使用很多变形滤镜,就像用VirtualDub一样。
让我们再加一条命令让这个视频最后淡出成黑屏,在脚本文件中再加入另外一行如下所示:

VersionReduceBy2FadeOut(15)

现在再次打开文件。前九秒钟剪辑应该没什么变化,在最后一秒,剪辑应该平滑的淡出成黑屏。
FadeOut滤镜有一个数字参数,表示淡出所用的帧数。由Version产生的视频剪辑刚好是每秒钟15帧(15fps),因此FadeOut的参数15使得剪辑在最后一秒的时候淡出。(筝儿:这里似乎有点错误,version产生的剪辑似乎是24fps的,所以后面的整个帧数也不对,应该总共是240帧,不过不影响对命令的学习,把后面trim的第二个参数都改为0就没什么关系了)

在淡出前有很长的一段时间,我们可以修整一下剪辑的开始部分来减少我们的等待时间。由Version产生的剪辑有150帧(15fps乘以10秒)。AviSynth从第0帧开始。因此,实际帧数是从0到149。FadeOut刚好会增加额外的一帧,这样一来,整个剪辑从头至尾,就有从0到150帧。让我们去掉开始的120帧。

VersionReduceBy2FadeOut(15)Trim(120,150) #砍掉前8秒(筝儿:建议写成 Trim(192,0) )

在这个例子中,我们第一次使用了注释。注释以#开始,持续到这一行的结尾,注释会被AviSynth完全忽略掉。Trim滤镜有两个参数,以分号隔开,分别表示剪辑中所要保留的第一帧和最后一帧。如果把表示最后一帧的参数设为0,则意味着整个剪辑的结尾,因此上面的trim命令也可以简单的写成Trim(120,0)。

用这种计算帧数的方式是很麻烦的,使用象VirtualDub这样的应用程序来打开一个已经完成了一部分的脚本就要简单得多,因为VirtualDub可以为你显示帧数。你也可以使用ShowFrameNumber滤镜,这个滤镜可以显示每一帧本身的帧序号。

再练习一个比Version更有用的滤镜AVISource,这个滤镜可以从硬盘中读取一个AVI文件(或者是一个其他类型的文件)。如果你手边现在就有AVI文件,你就可以按照下面所示试一下:

AVISource("d:capture.avi") #这里写你自己的AVI文件的实际路径和文件名ReduceBy2FadeOut(15)Trim(120,0)

只需要脚本中有一行AVISource命令就可以令视频处理程序支持大于2GB以上的AVI文件,否则的话一般视频处理程序只支持小于2GB的AVI文件。

2.2 非线性编辑

现在我们开始学习有意思的部分了。按照下面的脚本生成一个AVS文件:

StackVertical(Version, Version)

现在运行这个脚本:出现了两个版本信息,一个在另一个的上面。StackVertical并不用数字或者字符串作为参数,它是用视频剪辑作为参数的。在这个脚本中,Version滤镜被调用了两次。每一次,它都返回一个视频剪辑的复本。这两个副本视频剪辑都传递给了StackVertical,然后StackVertical把它们组合在一起(而不管它们是从哪里来的)。

这类滤镜中最有用的一个是UnalignedSplice,它能够把视频头尾相连。下面是一个载入了三个AVI文件并能够连起来播放的脚本:

UnalignedSplice(AVISource("d:capture.00.avi"),AVISource("d:capture.01.avi"),AVISource("d:capture.02.avi"))

StackVertical和UnalignedSplice都可以带两个或者最多六个参数。你可以用+运算符作为UnalignedSplice的简捷方式。例如,上面的脚本和下面的脚本完成同样的功能:

AVISource("d:capture.00.avi + AVISource("d:capture.01.avi") + AVISource("d:capture.02.avi")

现在假设你用某个程序抓屏,并且存成了多个AVI片段,但是把声音放在了一个单独的WAV文件当中了,我们能把这些都组合在一起吗?你猜呢:

AudioDub(AVISource("d:capture.00.avi")+AVISource("d:capture.01.avi")+AVISource("d:capture.02.avi"), WAVSource("d:audio.wav"))
(筝儿:上面的例子应该写成一行)
2.3 语法

2.3.1 表达式

一个AviSynth脚本由下面这样的多行语句组成:

变量名 = 表达式

在这个例子中,求出的表达式的值存放在变量名当中。还可以用简单的方式来表示,这一点很重要:

表达式

在这个例子中,表达式的值求出来之后被放在一个特殊的剪辑变量last当中。上面的语句就相当于:

last = 表达式

脚本结尾总是写成这样:

return 表达式

这里的表达式已经求出值并且作为脚本的返回值,也就是说,现在视频剪辑可以用能够打开AVI文件的应用程序播放了。

调用函数的表达式的基本形式如下:

函数(参数表)

剪辑函数可以产生一个新的视频剪辑,但不会改变现有的剪辑。参数表是用逗号隔开的函数的参数列表。参数表可以为空(意思是全部或者部分参数可选)

如果滤镜函数以视频剪辑作为第一个参数,而且这个参数没有给出,那么就会使用一个特殊的变量last来代替。

AviSynth滤镜可以带命名参数。命名参数可以以任意顺序来说明,而且,滤镜会为你没有选择的参数取默认值(命名参数总是可选的)。这使得某些滤镜用起来更容易一些。

你可以用

Subtitle(“Hello, World!”, text_color=$00FF00, x=100, y=200)

来代替

Subtitle(“Hello, World!”, 100, 200, 0, 999999, “Arial”, 24, $00FF00)

剪辑函数有一种替换语法(称为“面向对象设计的符号”):

表达式.函数(参数表)

例如:

Version.ReduceBy2.FadeOut(15)

这等价于

函数(表达式, 参数)

例如:

FadeOut(15, ReduceBy2(Version))

而且可以理解为函数作用于表达式。面向对象设计的符号有一个缺点就是只能使用带有一个视频剪辑参数的滤镜,而不能用于带有多个参数的滤镜。

不管语法看起来有多复杂,所有的AviSynth函数都可以生成输出帧数和帧速率的定义号。AviSynth在读完脚本之后就知道输出会有多长,帧速率是多少,以及所有输入的剪辑顺序。这些都在打开脚本的时候被计算出来。只有实际的过滤过程是按照需要在运行时进行的。

注释:AviSynth忽略任何以#开头直到这行末尾的内容。

忽略大小写:aVISouRCe 和 AVISource是一样的

下一行继续或者接前行:

Subtitle(“Test-Text”)
Subtitle( “Test-Text”)
Subtitle( “Test-Text”)

(筝儿:Subtitle的第一个参数是视频剪辑参数,不可缺省,上面写的例子只是为了说明换行的用法,实际应该写成 Subtitle(version, “Test-Text”) ,这里version可以替换为其他的视频剪辑文件)

2.3.2 变量

变量名最长可以有50个字符,包括字母、数字和下划线,但是不允许用其他的符号。名字不可以以数字开头。

下面是可以使用的变量类型:

clip:包括视频和/或音频的视频剪辑。脚本中至少要有一个clip变量并且要由脚本返回。

string:两边加双引号(英文引号——筝儿)。string类型文本可以包括任何字符,但不包括表示string结束的双引号。如果你要让字符串包括双引号,就要用文本符号(中文引号——筝儿)。你还可以用Windows的扩展ASCII码中的弯双引号来代替直的双引号来绕过这种限制(似乎就是用中文引号来代替英文引号,但我试好像不行——筝儿)。

int:以数字字符串形式输入,开头可以有+或者-。

float:带小数点的数字字符串,也可以有+或者-。例如 +1. 被看作浮点数。

val:用做函数的参数类型,而不管它是int还是float类型。

bool:只能为TRUE或者FALSE。

hexadecimal numbers:前面加$表示。这个变量被当作整数对待。很多滤镜用这种声明来表示颜色。例如:$FF8800 表示桔色。

global:定义一个全局变量,通常用于所有的用户定义函数和主脚本。V2

下面是前文例子的另一个版本,但是这里可操作性要更好,而且更容易理解:

a = AVISource("d:capture.00.avi")b = AVISource("d:capture.01.avi")c = AVISource("d:capture.02.avi")sound_track = WAVSource("d:audio.wav")AudioDub(a+b+c, sound_track)

2.4 运算符

对于所有类型的操作数(clip,int,float,string,bool)你可以使用:
== 等于
!= 不等于
|| 或
&& 与

对于数值类型(int,float)
+ 加
- 减
* 乘
/ 除
% 求余
>= 大于等于
<= 小于等于
< 小于
> 大于

AviSynth在以前的版本中是从右到左解析表达式的,这样可能会给出错误结果:

a = 10 – 5 – 5 结果为 10- (5 – 5 ) = 10 而不是 (10 – 5 ) – 5 = 0 !

这个错误已经被改正过来。从2.53版开始,连乘法和除法都是从左到右解析(而不是从右到左)。

对于string类型:
+ 加
>= 大于等于(大小写敏感)
<= 小于等于(大小写敏感)
< 小于(大小写敏感)
> 大于(大小写敏感)

对于clip类型:
+ 和函数UnalignedSplice的功能一样
++ 和函数AlignedSplice的功能一样

对于bool类型

?: 有条件执行代码

b = (a==true) ? 1 : 2

在pseudo-basic语言中意思是:

if (a=true) then b=1 else b=2

3 函数
3.1 脚本函数

这些函数的输入输出不是剪辑,而是脚本中用到的其他变量。

3.1.1 数值函数

Floor (float): 将 float 类型转换成 int 类型 Floor(1.2) = 1 Floor(1.6) = 1 Floor(-1.2) = -2 Floor(-1.6) = -2
Ceil (float): 将 float 类型转换成 int 类型 Ceil(1.2) = 2.0 Ceil(1.6) = 2.0 Ceil(-1.2) = -1 Ceil(-1.6) = -1
Round (float): 将 float 类型转换成 int 类型 Round(1.2) = 1 Round(1.6) = 2 Round(-1.2) = -1 Round(-1.6) = -2
Int(float): 将 float 类型转换成 int 类型(四舍五入). v2.07 Int(1.2) = 1 Int(1.6) = 1 Int(-1.2) = -1 Int(-1.6) = -1
Float(int): 将 int 类型转换成 float 类型. v2.07
Frac(float): 返回float 类型数值的小数部分. v2.07 Frac(3.7) = 0.7 Frac(-1.8) = -0.8
Abs (integer) / Abs(float): 计算整数和单精度类型数值的绝对值. v2.07 Abs(-3.8) = 1.8
Sign(int) / Sign(float): 以 -1, 0 or 1的形式返回数值的符号位. v2.07 Sign(-3.5) = -1 Sign(3.5) = 1 Sign(0) = 0
HexValue(string) 返回一个十六进制字符串的值. v2.07 HexValue ( "FF00" ) = 65280

Sin (float) v2
Cos (float) v2
Pi () v2
Log (float) v2
Exp (float) v2
Pow (float base, float power) v2
Sqrt (float) v2

Rand([int max] [, bool scale] [, bool seed]): 返回0到最大值(max)之间的随机整数. v2.07 默认值: max = 32768 scale = TRUE ( TRUE = 正常模式, FALSE = 模块模式) seed = FALSE (TRUE = 用时间作为随机数种子) Rand(100) = 0到99之间的整数
Spline (float X, x1,y1, x2,y2, ...., bool "cubic") v2.5 使用控制点x1/y1在X点处插入Y 值 至少要有两个x/y对. 插值可以是立方(结果为样条曲线)或者线性(结果为多边形) Spline(5, 0,0, 10,10, 20,0, false) = 5 Spline(5, 0,0, 10,10, 20,0, true) = 7

3.1.2 字符串函数

UCase(string): 返回全部大写的字符串 v2.07 UCase("AviSynth") = "AVISYNTH"
LCase(string): 返回全部小写的字符串 v2.07 LCase("AviSynth") = "avisynth"
RevStr(string): 返回字符串的倒序. v2.07 RevStr("AviSynth") = "htnySivA"
StrLen(string): 返回字符串的长度. v2.07 StrLen("AviSynth") = 8
Findstr(string1, string2): v2.07 返回字符串2在字符串1中的位置.大小写敏感. Findstr("AviSynth","syn") = 4
LeftStr(string, length) / RightStr(string, length): v2.07 返回指定长度的字符串的左部分或者右部分 LeftStr("AviSynth",3) = "Avi"
MidStr(string, start [, length]): v2.07 返回字符串中从start开始(第一个字符的start是1) 到指定长度或者到结尾的字符串字符。 MidStr("AviSynth",3,2) = "iS"
VersionNumber() v2.07 VersionNumber() = 2.07
VersionString() v2.07 VersionString() = "AviSynth 2.08 (avisynth.org) 22 nov. 2002"
Chr(int): 返回ASCII 码字符 v2.5 Chr(34) returns the quote character
Time(string): 返回按照字符串格式定义的当前系统时间v2.5 输出格式代码%a 星期名缩写%A 星期名全写%b 月名缩写%B 月名全写%c 日期和时间按照本地方式表示%d 以十进制数表示一月中的每天 (01 – 31) %H 小时采用24小时制(00 – 23) %I 小时采用12小时制 (01 – 12) %j 以十进制数表示一年中的每天 (001 – 366) %m 以十进制数表示月份(01 – 12) %M 以十进制数表示分钟(00 – 59) %p 当前本地时间中 A.M./P.M. 表示 12小时制 %S 用十进制数表示秒(00 – 59) %U 用十进制数表示一年中的星期,一星期中的第一天为星期日 (00 – 53) %w 用十进制数表示星期(0 – 6; 星期日为 0) %W 用十进制数表示一年中的星期,一星期中的第一天为星期一 (00 – 53) %x 用当前本地格式表示日期 %X用当前本地格式表示时间%y 用两位十进制数表示年份 (00 – 99) %Y 用四位十进制数表示年份%z, %Z 时区名或者缩写,如果时区名未知则没有字符%% 百分号 # 标志可以放在任何格式代码前。此时,格式代码的含义变为如下所示: %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% # 标志可以忽略。 %#c 长格式显示当前本地日期和时间,例如: “Tuesday, March 14, 1995, 12:41:29&#8222;. %#x 长格式显示当前本地日期,例如: “Tuesday, March 14, 1995&#8222;. %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y 去掉开头的0 (如果有的话).

3.1.3 转换

Value(string): 返回一个字符串的值. v2.07 Value( "-2.7" ) = 2.7
String(float / int / string): 将一个数值转换成一个字符串 v2 e.g.Subtitle( "Clip height is " + String(last.height) )

3.1.4 测试函数

IsBool (变量)
IsInt (变量)
IsFloat (变量)
IsString (变量)
IsClip (变量)

3.1.5 其他函数

Select(index, item0 [, item1...]): 返回由索引号index选择的项目item (0=item0). 项目可以是任何变量、剪辑甚至是混合信息。v2.07

Defined (var): 用于用户定义函数中定义可选参数。

Default (x, d): 如果定义了x,则返回x,否则返回d

Exist(filename): 如果文件存在则返回TRUE否则返回 FALSE

NOP 返回 NULL, 主要用于没有返回值项目的条件执行语句,例如import和没有else语句的条件语句。v2.07

Eval (string)

Apply (func-string, arg,...): Eval("f(x)") 等价于f(x),等价于Apply("f", x))

你可以这样使用Eval函数:settings = "352, 288"Eval( "BicubicResize(" + settings + ")" )

Import (filename): 另一个Avisynth脚本的内容值(输入另一个脚本的文本)
为了获得错误报告或者捕获用户定义函数的错误输入,你可以这样使用:
Assert (bool, string error-message)

Try ... Catch 是一个检测是否会发生错误的函数:

Try { AviSource("file.avi")}Catch(err_msg) { Blackness.Subtitle(err_msg)}

3.2 运行函数

现在已经有“条件滤镜”可以在帧处理的时候计算脚本,这样你就可以基于帧来更改变量。用于计算脚本内容并且给出返回值的运行函数对我们更有用处。v2.5

下面是一个简单的例子,用来计算每一帧的平均亮度并且显示。Version() # 产生测试剪辑ConvertToYV12 # 使用YV12FadeIn(10) # 产生亮度变量以便我们能看到发生了什么ScriptClip(" Subtitle(String(AverageLuma())) ") # 计算每一帧的亮度值#将平均亮度输出转换成字符串并且显示在输出剪辑上ConvertToRgb # 以RGB形式显示

3.3 控制函数

SetMemoryMax(int): 设置AviSynth 使用的最大内存 (以 MB为单位) v2 。在有些版本里,默认设置为5MB,这是很低的。如果你遇到了什么问题(例如,运行速度慢)试着将这个值设置成至少32MB.
SetWorkingDir(string): 设置Avisynth的默认路径. v2 为了便于导入源剪辑,这是很基本的用法。这不会影响插件的自动导入。如果成功则返回0,否则返回-1。

3.4 剪辑属性

这些函数以剪辑作为输入,以剪辑的属性作为返回值。
Width(clip)
Height(clip)
Framecount(clip)
Framerate(clip)
Audiorate(clip)
Audiolength(clip)
Audiochannels(clip)
Audiobits(clip)
IsRGB(clip)
IsRGB24(clip) v2.07
IsRGB32(clip) v2.07
IsYUY2(clip)
IsYV12(clip) v2.51
IsPlanar(clip) v2.51
IsInterleaved(clip) v2.51
IsRGB24(clip)(clip)
IsRGB32(clip)(clip)
IsFieldBased(clip)
IsFrameBased(clip)
GetParity(clip)

别忘了:你可以将这个属性用于隐含变量LAST或者是面向对象的声明BilinearResize(Width/2, Height/2) 等价于BilinearResize(Width(Last)/2, Height(Last)/2) 等价于BilinearResize(Last.Width / 2, Last.Height / 2)

3.5 用户定义函数

你可以定义自己的函数,下面的例子做了很好的解释:

Function NTSC2PAL( clip c) { Assert(c.height == 480, "NTSC2PAL: input clip must have 480 scan lines") Bob(c, height=576) return Weave()}
甚至可以定义递归函数:

function TRANSITION(clip clip, int start, int expo, int overlap){ return ( start >= clip.framecount-expo ? Trim(clip,start,0) : Dissolve(Trim(clip,start,start+expo-1), TRANSITION(clip,start+expo,expo,overlap), overlap )}

带有一个以上输入剪辑的函数

有一些函数可以将两个或者两个以上的剪辑按照不同的方式组合起来。每个函数描述了视频内容经过了怎样的计算,但是这里给出的是最终剪辑应该有的一些基本属性。

输入剪辑总是具有相同的颜色格式和——除了Layer之外——相同的尺寸。

帧速率 帧数 音频内容 音频采样速率
AlignedSplice, UnalignedSplice 第一个剪辑 所有剪辑的总和 参考滤镜说明 第一个剪辑
Dissolve 所有剪辑的和减去重叠数 参考滤镜说明
MergeLuma, MergeChroma 第一个剪辑 短一点的剪辑的最后一帧将一直重复到这个剪辑的结尾 第一个剪辑
Layer
Subtract 长一点的剪辑
StackHorizontal, StackVertical
Interleave (第一帧的帧速率)X (剪辑数) 2 X 长剪辑的帧数

正如你所看见的,函数并不是完全平衡的,而是受到了第一个剪辑的属性的影响。

4 插件
使用下面这些函数,你可以向AviSynth中加入外部函数。
同名函数调用的顺序为:V2
1.来自外部插件的函数
2.用户自定义的函数
3.内置函数

LoadPlugin ("filename"[,...]) :调用一个或多个avisynth 的外部插件(DLLs).

LoadVirtualDubPlugin ("filename","filtername", preroll)
这是调用一个用于VirtualDub的插件. "filename" 是.vdf 文件的文件名. 调用这个函数后,这个滤镜在avisynth中就被命名为"filtername"。 VirtualDub 滤镜只支持RGB32。如果视频是RGB24格式的,就必须使用ConvertToRGB32函数进行转换 (ConvertToRGB 函数不行)。有一些滤镜的输出依赖于前面的帧内容,此时,preroll应该设成至少是滤镜能够填充完他的缓存和/或能够升级完它的内部变量所需要预处理的帧数。

LoadVFAPIPlugin ("filename","filtername") :允许使用VFAPI插件(TMPGEnc 输入插件)。

自动载入插件和命名优先级v2

可以用用用户定义函数或者(全局)变量来将所有的插件和脚本放在一个目录下面,该目录下的所有扩展名为.AVS.和DLL的文件都可以在启动时载入、卸载或者在脚本需要的时候动态调入。

这个目录下的脚本应该只包括函数定义和全局变量,没有主处理部分(否则会产生奇怪的错误),也不建议将其他文件放在这个目录里面。

这个目录存储在注册表当中(V2.5版2键值有所改变)。你可以双击a.REG文件按照下面所写来设置路径(当然要插入你的实际路径)

REGEDIT4[HKEY_LOCAL_MACHINESOFTWAREAvisynth]"luginDir2_5"="c:\program files\avisynth\plugins"

函数命名顺序优先级如下:
插件函数(总是有最高的优先级)
用户定义函数(优先级高于内置函数,你可以覆盖内置函数)
内置函数

在每组函数内部,最后载入的优先级最高,在名字空间冲突上没有错误。
5 滤镜
5.1 产生剪辑的源滤镜
AVISource / OpenDMLSource / AVIFileSource / WAVSource AVISource 在引用和打开文件时以一个或多个文件名作为参数。
DirectShowSource DirectShowSource 通过DirectShow读取文件名
SegmentedAVISource / SegmentedDirectShowSource SegmentedAVISource 滤镜每个参数可以自动载入多达100个avi文件
BlankClip / Blackness BlankClip 滤镜产生一个指定长度(以帧计)纯色无声的视频剪辑。
ImageReader 这个滤镜通过读取静止画面来产生一个视频剪辑
5.2 画面处理滤镜
AddBorders AddBorders在画面周围添加黑色边框
Blur / Sharpen 这两个是简单的3x3点阵的模糊和锐化滤镜
ColorYUV 独立调整颜色和亮度
ConvertToRGB / ConvertToYUY2 / ConvertToYV12 / ConvertBackToYUY2 ConvertToRGB32 / ConvertToRGB24 AviSynth内部可以处理四种颜色格式: RGB24, RGB32, YUY2 和YV12。这些滤镜可以在这些格式之间转换
Crop / CropBottom Crop 去掉每一帧的额外象素
GeneralConvolution 通用转换
Greyscale 将视频转换成灰度模式
Invert
Layer / Mask / ResetMask / ColorKeyMask 叠加两个视频
Letterbox Letterbox 可以很简单的令影片每一帧的上下边界或者四面出现黑框
Levels Levels 滤镜调整亮度、对比度和gamma值
Limiter 这是一个令剪辑的级别限制在CCIR-601 范围内(“级别”似乎是媒体协议中对视频品质的一种规范,我也不懂啦——筝儿)
MergeChroma / MergeLuma 这个滤镜可以把一个视频剪辑的亮度和色度与另外一个视频剪辑混合。有一个可选的重量值,这样就可以规定两个剪辑之间亮度色度的百分比。
ReduceBy2 / HorizontalReduceBy2 / VerticalReduceBy2 ReduceBy2 将每一帧的大小减小一半
BilinearResize / BicubicResize / LanczosResize / PointResize Resize滤镜通过不同的采样算法,可以将输入的视频帧的大小强制调整为指定大小
RGBAdjust 分别调整每个颜色通道
ShowAlpha 显示一个剪辑的alpha 通道
SpatialSoften / TemporalSoften SpatialSoften 和 TemporalSoften 滤镜通过选择性地混合象素达到去除噪点的效果
SwapUV / UToY / VToY / YToUV 交换或复制剪辑的色度通道
Tweak 调整灰度、饱和度、亮度和对比度
5.3 编辑滤镜
AlignedSplice / UnalignedSplice AlignedSplice 和UnalignedSplice 将两个或更多的视频剪辑端到端的连接起来
AssumeFPS / ChangeFPS / ConvertFPS 以不同的方式改变帧速率
DeleteFrame DeleteFrame 删除参数中指明的单独一帧
Dissolve Dissolve 与AlignedSplice类似, 只是这里的剪辑是通过重叠来连接的
DuplicateFrame DuplicateFrame 复制参数中制定的一帧
FadeIn / FadeOut FadeIn 和 FadeOut 可以令视频流在开始或结尾处线性变黑
FreezeFrame FreezeFrame 滤镜替换第一帧和最后一帧之间的所有帧
Loop 从一个片段的第一帧到最后一帧循环播放指定次数
SelectEven / SelectOdd SelectEven 令输出视频流只使用偶数帧
SelectEvery SelectEvery 是类似 SelectEven 和 Pulldown的通用滤镜
SelectRangeEvery 这个滤镜选择某一阶段的一系列帧
Trim Trim 截断视频剪辑,使之只包括从first-frame开始到last-frame结束的帧
5.4 交织视频处理滤镜
AssumeFrameBased / AssumeFieldBased Avisynth 跟踪一个给定剪辑是基于场的还是基于帧的
AssumeTTF / AssumeBFF 限制场边界
Bob Bob载入一个剪辑并将其解交织
ComplementParity ComplementParity 可以把顶场变成底场或者是相反
DoubleWeave 如果输入的是基于场的剪辑,DoubleWeave滤镜与 Weave功能相同, 否则它将产生二倍的帧数
Interleave Interleave 把几个剪辑按照一帧一帧的方式交织起来
Pulldown Pulldown滤镜从源视频中每五帧简单的抽取两帧
SeparateFields SeparateFields 带一个基于帧的剪辑,并且把每一帧分割成组件场
SwapFields SwapFields滤镜将两个场重叠成一个交织帧
Weave Weave 将输入视频成对的场合并成隔行扫描帧
5.5 音频滤镜
在v2.5 版以前,当使用以下这些音频滤镜时声音采样是被转换成16位处理的。从v2.5版开始,如果某一滤镜需要特殊的采样类型,音频采样将会自动转换。这意味着大多数滤镜都会支持多种类型的输入,但是如果某个滤镜不支持所给出的采样类型,它将自动将采样转换成它支持的类型。
一般来说,普通用户不会关心这些的。可以通过ConvertAudio functions函数完成指定采样类型的强制转换。.
如果采样类型为浮点型,在 AviSynth 输出数据时,由于浮点型无法转换成有效的AVI 数据,因此它将转换成16 位格式输出。

Amplify / AmplifydB 将音频采样放大指定倍数
AssumeSampleRate 调整音频采样反馈速度
AudioDub AudioDub从第一个参数中得到视频流,从第二个参数中得到音频流,然后将他们组合起来
ConvertToMono 合并音频通道
ConvertAudioTo8bit / ConvertAudioTo16bit / ConvertAudioTo24bit / ConvertAudioTo32bit / ConvertAudioToFloat 将音频采样从8位转换成16位
DelayAudio DelayAudio一秒一秒的延迟音轨
EnsureVBRMP3Sync 当查找或者截断时,用以保证mp3与avi之间的同步
GetChannel 从音频信号中返回一个通道
KillAudio 从一个剪辑中完全删除音频
MergeChannels 将两个或多个音频剪辑的通道合并在一起
MixAudio 混合两个剪辑的音频
Normalize 不限幅的尽可能放大整个波形
ResampleAudio 形成一个音频采样速率的高品质通道
5.6 特殊滤镜
Animate / ApplyRange Animate (ApplyRange)是一个后置滤镜,它能够得到它所带参数滤镜的值,而这个参数滤镜是连续变化(或者不变)的
ConditionalFilter / FrameEvaluate / ScriptClip ConditionalFilter 在某些条件下返回source1, 否则返回source2。 ScriptClip 在计算每一帧之后返回剪辑
FixBrokenChromaUpsampling 我发现MS DV 编码器对于色度通道的上采样不正确,因此添加了FixBrokenChromaUpsampling 滤镜用以更正
FixLuminance 修正垂直亮度偏移
FlipHorizontal / FlipVertical 令视频上下移动或者左右移动
Imagewriter 把帧当作图像写入硬盘
PeculiarBlend 这个滤镜用特殊的方法把每一帧和后面的帧混合在一起
Reverse 这个滤镜能够让剪辑倒播
Subtitle Subtitle滤镜在帧上的某个区域内显示一行文本
TurnLeft / TurnRight 将剪辑顺时针旋转90度/逆时针旋转 90度
5.7 调试滤镜
ColorBars ColorBars滤镜产生一个含有可调整成任意图像大小的SMPTE色度条的视频剪辑
Compare 比较两个剪辑并且输出显示关于它们之间差别的信息
Histogram 添加一个柱状图.
Info 输出显示图像和声音信息
MessageClip MessageClip产生一个含有文本信息的剪辑
ShowFiveVersions ShowFiveVersions可以载入五个视频流并且把它们从左到右错开排列起来
ShowFrameNumber / ShowSMPTE ShowFrameNumber在每一帧上显示Avisynth认为的该帧的序号
StackHorizontal / StackVertical StackHorizontal可以载入两个或更多的视频剪辑并且把它们从左到右一起显示出来
Subtract Subtract根据相关象素间的不同来设置每一个象素从而产生一个输出剪辑
Version Version滤镜产生一个短的版本和拷贝权的视频剪辑
回复

使用道具 举报

发表于 2007-12-27 23:30:54 | 显示全部楼层
专业人士呀,内容太专业了,看不懂呢,顶
回复

使用道具 举报

发表于 2008-1-11 15:11:44 | 显示全部楼层
看上去好复杂啊……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|有间论坛

GMT+8, 2024-11-27 02:32 , Processed in 0.075835 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表