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„. %#x 长格式显示当前本地日期,例如: “Tuesday, March 14, 1995„. %#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]"PluginDir2_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-11 21:14:39)
暴雪 (2007-12-12 14:51:45)
虔敬人生 (2007-12-13 09:50:51)
QUOTE:
自己译?厉害,不过 AviSynth网上不是有教程吗MOTO (2007-12-15 23:24:26)
pss1983 (2007-12-20 22:30:53)
机子太烂了,等换了再实际操作啊
faw08 (2008-1-05 01:45:25)
AviSynth是由Ben Rudiak-Gould首創的一種非常有用的工具,能夠提供各種方式來合併和濾鏡處理影像文件。最獨特的就是AviSynth並不是一個孤立的影像處理程序,而是在影像文件和應用程序之間擔任「中間人」的角色。
AviSynth的基本工作原理是這樣的:
首先建立一個包含特定命令的文本,稱之為「腳本」(後綴為avs),這些命令指定要運行處理的影像文件和濾鏡;
然後運行影像應用程序,比如VD或ND,打開腳本。此時AviSynth就開始工作了,打開腳本中指定的影像文件,運行特定的濾鏡,並把輸出結果提供給影像應用程序。但影像應用程序並不瞭解AviSynth在後台所做的處理,而認為是直接打開了一個「被處理過」的影像文件。
因此使用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處理的影像文件在運行過程中直接導入應用程序,沒有臨時文件,所以節省硬盤空間。
AviSynth現在有3個版本,第一個是Ben Rudiak-Gould的首先編譯的AviSynth v1.0b;在Ben Rudiak-Gould停止開發後,Edwin van Eggelen繼續開發,最新的版本是AviSynth v1.0b6;在2002年7月第二次源碼編寫計劃開始,目前最新的版本是AviSynth v2.0.6,新的v2.5版還在開發中。
最後一個版本比較強大,更新速度快,增加了許多實用的命令,也吸收了一些優秀的第三方濾鏡成為內建濾鏡,強力推薦使用。
faw08 (2008-1-23 03:46:29)
也許你還是不明白AviSynth能做什麼,舉些簡單的例子,你需要對一段avi進行處理。你想把畫面尺寸縮小,你可以用avs;你想把畫面上的雜點消除,你可以用avs;你想把畫面處理得銳利些,你還是可以用avs;AviSynth是橋樑,位於媒體文件和壓縮軟件之間,壓縮軟件可以通過AviSynth調用和處理媒體文件。而且不僅僅是壓縮軟件,甚至是播放器也能調用avs,對播放的文件進行處理,得要需要的播放效果。
AviSynth首先要編寫建立一個包含特定命令的文本。注意這裡的文本,簡單的說就是windows的寫字板寫出來的文件,你可以用任何一種文本編輯器打開進行編輯。這一特定命令的文本稱之為"腳本"(文件後綴名為avs),這些命令指定要運行處理的媒體文件和濾鏡!
AviSynth的平台和相關濾鏡更新比較快,功能不斷增加,編輯avs腳本也更簡單。在射手網可以下載到這個平台軟件。至於濾鏡可以到得到http://www.avisynth.org/warpenterprises/
下載,至於doom9論壇,大家知道有這麼個烏合的巢穴就可以了!
上面簡單介紹了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非常靈活,要按具體情況具體分析。
第二,需要認識avs的橋樑作用。修飾之餘盡可能的使用壓縮軟件本身的功能。對於real壓縮,如rmvb壓制中幀率的改變就可以在壓縮軟件中進行設置,而不要在avs中寫入相關的語句。另外各種壓縮軟件使用的是real的壓縮內核,而real壓縮一般以YV12的快速處理環境為主。這也是在使用avs壓制rmvb時需要注意的問題。
自己覺得上文對avs的介紹及應用範圍要比下面的內容來的更重要!這是我直到現在才撰寫完畢這篇小文的良苦之處。
下面先簡單的介紹些基本方法和常用濾鏡,濾鏡可以理解為各種處理視頻的工具。
首先安裝avisynth,並將常用慮鏡插件dll文件拷貝到安裝目錄的plugin目錄裡。
一、基本代碼
1. LoadPlugin(),加載插件。
如:
LoadPlugin("VSFilter.dll") 加載字幕插件
LoadPlugin("mpeg2dec3.dll") 加載DVD的mpeg2編碼器插件
LoadPlugin("mpasource.dll") 加載mp3插件
請下載以上提到的濾鏡!並解壓制到plugin目錄裡(當然目錄可以自己選定),如果avs文件和濾鏡不再同一個目錄下,記得要把加載濾鏡的路徑名寫全了。有些濾鏡或者腳本是avisynth核心的濾鏡或腳本,也就是avisynth本身提供的功能,這些就不需要加載,其它的都需要加載。你也可以用SetWorkingDir設定插件文件的工作路徑
SetWorkingDir("d:\GORDIA~1\") # 設定AVS 腳本調用dll 插件文件的工作路徑
2.源媒體讀取
DirectShowSource("e:\vob\ss.VOB")
DirectShowSource()在高版本avisnyth中顯得更萬能些,常用的媒體格式,如avi、mpge1/dat、mpge2/vob/bin都可以加載,另外可以不用分離視頻和音頻,而直接壓縮!想要直接壓制vob請使用高版本的avisynth,如目前的2.54 。如果遇到打不開的媒體格式你大都可以試試看DirectShowSource。
AVISource(e:\avi\1.avi,false)
這個對於DVDRIP壓制者來說可能更常用些.false表示禁止音頻!
mpeg2source("XXX.d2v")
這個用於解碼DVD的mpeg2格式的視頻
WAVSource("e:\vob\ss.wav") 讀取wave音頻
AC3SOUECE("e:\vob\ss.ac3") 讀取ac3音頻
MPASOURCE("e:\vob\ss.MP3") 讀取mp3音頻
註:WAVSOURCE和AVISOURCE是屬於核心腳本,無須讀取插件,但AC3SOURCE和MPASOURCE需要讀取AC3SOURCE和MPASOURCE插件。DirectShowSource的讀取需要安裝各種音頻和視頻的解碼器
3. crop()、LanczosResize()裁黑邊和調整大小
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畫面大小了!
4.亮度濾鏡
亮度濾鏡是使用avs壓制vob-rmvb vcd-rmvb的又一關鍵因素。畫面太暗的rmvb是失敗之作
介紹2個
Levels(0,1.5,255,0,255)
改第二個,我感覺數值在1.3-2之間比較合適,一般1.5比較合適
Tweak(0,1,20,1)
4個浮點數分別表示:調節色度,飽和度,亮度,對比度。一般將第三個調節在0-30之間,以15-20為宜
個人感覺level()比較好,主要調背景為主,而vob文件主要是背景暗。注意Tweak的其他調節可能和顏色控制環境有關,如YUY2,因此其它的最好不要再改動
註:ffdshow目前的版本還是不能支持mpge2唉!否則可以利用它來調節亮度了
5.字幕濾鏡
TextSub("h:\avs\jrvs.ssa") 加載水印文本
VobSub("e:\vob\ss.idx") 加載影片字幕
6.其它慮鏡介紹,在rmvb壓制中不推薦使用,如部分朋友選用的
FluxSmooth(5,7) 柔化濾鏡
Convolution3d("moviehq") 3D優化濾鏡
2者需要加載相應的濾鏡插件
7.常用音頻處理腳本:
ResampleAudio(44100)
DELAYAUDIO(XXX,30)
AmplifydB(wavsource(「XXX.WAV」),3,3)
例子:
DelayAudio(wavsource(」XXX.WAV「),-30)30的單位是毫秒,經典的解決音畫同步問題;
又如:
WAVSOURCE(「xxx.wav」).ResampleAudio(48000)
音頻重新采樣,采樣率48
再如:
AmplifydB(wavsource(「xxx.wav」),3,3)
左右聲道放大3DB
8.色彩模式的轉換
有些壓縮軟件不支持某些色彩模式,例如默認情況下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()
其他的也類似
9.截圖
沒有想到用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")
10.合成
AudioDub(video, audio)
合成常用於real格式的壓制,製作rmvb的時候就需要把視頻和音頻合成後交給real壓縮軟件,而製作avi則不需要合成視音頻。這主要是因為real格式要求視音頻都必須用real壓縮,而avi則可以使用多種音頻格式,一般是單獨壓縮視頻,然後再用其他軟件合成視頻音頻。
簡單的例子
V=AVISOURCE(「xxx.avi」,FALSE,「YUY2」)
A=WAVSOURCE(「xxx.wav」)
AudioDub(V,A)
合成在rmvb壓制方面的例子可以參考後面的rmvb壓制部分
需要注意的是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)。兩種寫法不能混用哦。
二、壓制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) 語句。
三、rmvb的壓制
下面是一些使用avs壓制rmvb的方法
1
LoadPlugin("VSFilter.dll")
LoadPlugin("mpasource.dll")
video=AVISource("c:\1.avi",false).TextSub("c:\logo.ssa").VobSub("c:\1.idx").Lanczosresize(512,384) #定義了avi源、字幕、水印和畫面大小
audio=mpasource("c:\1.mp3") #音頻
AudioDub(video, audio)
為簡便起見,以avi文件為例說明語法,但此例不推薦用,直接用壓縮軟件+ffdshow設置即可。原始avs加載了至少3個額外的濾鏡,已略去!
該方法可以用於雙語DVDRIP的壓制,使用雙語處理的軟件提取自己要的聲道即可,而不要再合併成avi了!
DTS音軌格式的可以用這個avs法壓制
先根據中高級教程裡的方法將DTS音頻轉換成wave格式,如放在e:\avi\目錄裡
avs可以這麼寫:
LoadPlugin("VSFilter.dll")
video=AVISource("c:\1.avi",false).TextSub("h:\avs\jrvs.ssa").VobSub("e:\avi\t1.idx")
audio=WAVSource("e:\avi\t1.wav")
AudioDub(video, audio)
如此可以不用再合併那麼費事了!
2
LoadPlugin("VSFilter.dll")
b=directshowSource("e:\avs\cd1.avi").TextSub("e:\BBSLogo\logo.ssa").VobSub("e:\avs\cd1.idx").Lanczosresize(608,320)
c=directshowsource("e:\avs\cd2.avi").VobSub("e:\avs\cd2.idx").Lanczosresize(608,320)
final=b+c
return final
這個語法很好,直接將多CD的壓製成一個rmvb,可以在一定程度上解決單CD碼率過度錯位。如分別1pass壓制CD1和CD2可能會由於碼率錯位太大而使文件增大,但如果2個一起壓制,則可能由於碼率補償,平均碼率錯位反而不大,而使文件大小減小。
請注意,這裡自己可以將水印放在CD1上,而CD2不會顯示(說明什麼?呵呵!)
一般DTS的都要2CD以上,有時影片長度也不長,所以DTS的電影可以這麼寫avs壓制
LoadPlugin("VSFilter.dll")
video=AviSource("e:\cd1.avi",false).Vobsub("e:\cd1.idx").TextSub("c:\logo.ssa")+AviSource("e:\cd2.avi",false).VobSub("e:\cd2.idx")
audio=wavSource("e:\cd1.wav")+wavSource("e:\cd2.wav")
AudioDub(video, audio)
3
雙語的vcd分成單語來做
LoadPlugin("VSFilter.dll")
video=DirectShowSource("F:\mpge\*.dat").Levels(0,1.7,255,0,255).LanczosResize(480,360)
return GetChannel(video,2)
1 left channel
2 right channel ,一般是國語
據說這裡的*.dat表示成批壓制!
如果要求控制幀率,那麼有句改成這個
video=DirectShowSource("F:\mpge\*.dat",fps=25)
以上都是avi,都可以自動關聯ffdshow,所以亮度可以在ffdshow裡設置!但請同時去掉ffdshow的字幕和avisynth功能
4
製作成單音軌雙語
1.
Left=wavSource("C:\1.wav").getleftchannel
Right=wavsource("C:\2.wav").getrightchannel
mergechannels(Left,Right)
#monotostereo(Left,Right)
2.
Left=DireectShowSource("C:\1.mp3").getleftchannel
Right=DirectShowsource("C:\2.mp3").getrightchannel
mergechannels(Left,Right)
#monotostereo(Left,Right)
交給graphedit製成wav或Lame mp3
5
將雙語的rmvb製作成單語雙聲道的方法
1.用rma分離視頻及音頻
http://www.niuguo.net/forum/topi ... amp;bpg=1&age=0
2.安裝
http://matroska.free.fr/packs/Matroska_Pack_Full_v1.0.1.exe
寫一個avs腳本
DirectShowSource("C:\audio.rm").getchannel(1,1)
#1為左聲道
#2為右聲道
3.
用BRP重制這個音頻腳本,得到單語雙聲道無視頻的音頻rm
http://cool18.comicer.com/
4.用rma結合之前分離出來的視頻及重制的音頻
6
用rmvb直接壓制DVD
1、先將DVD的VOB文件用利用DVDDecrypter拷入硬盤。
2、利用dvd2avi軟件先生成一個d2v工程和AC3音頻。
3、利用Azid或其它軟件把ac3轉為標準的wav文件,這種對音頻處理較嚴謹且音質較好的方法。此外還可以用graphedt生成一個GRF,在AviSynth裡面用DirectShowSource導入即可,這樣還可以處理雙DTS的問題,前提是要裝 阿飛 的DTS.AC3;求快就用ac3source加載ac3音頻。
4、利用GK打開d2v工程,先Resolution,然後選制式、縱橫比,後按auto crop自動去邊,然後記住最右邊(左、上、右、下)的四個數值,填入Video=Crop(Video,6,10,-8,-12),注意這裡只取雙不取單;然後在GK中的output resolution中的Width右邊的小箭頭調畫面寬度,調完後將數字填入Video=LanczosResize(Video,640,480)中。
5、編輯.avs文件,主要模板如下:(#號不做處理)
#加載插件
#mpeg2dec3.dll主要功能是加載d2v工程文件。
#ldecomb.dll主要功能是影片場序處理,去拉絲。
#Convolution3DYV12.dll主要功能是改善電影畫面質量。
#VSFilter.dll加載SUB、SRT等格式的字幕。
LoadPlugin("D:\Program Files\GordianKnot\mpeg2dec3.dll")
LoadPlugin("D:\Program Files\GordianKnot\decomb.dll")
LoadPlugin("D:\Program Files\GordianKnot\Convolution3DYV12.dll")
LoadPlugin("D:\Program Files\GordianKnot\VSFilter.dll")
#加載d2v工程文件
#大家選擇自己放d2v工程文件的目錄和文件名
video=mpeg2Source(".:\path\.d2v")
#
#DVD畫面質量改善(有幾種狀態,專門文章會再介紹,大家用默認就行了)
video=Convolution3D(video,0, 3, 4, 3, 4, 2.8, 0)
#
#將YV12轉為YUY2
video=ConvertToYUY2(video)
#
#加載音頻(自行修改音頻文件的路徑和文件名)
audio=wavsource(".:\path\.wav")
Video=audioDub(video,audio)
#
#去絲處理(Decimate(5)是,NTSC制式轉為23.976,PAL的另有其它模式)
video=Telecide(video).Decimate(5)
#
#去邊處理(數字部分大家根據自己的情況修改,數字取雙不取單,後面兩個要有負號)
Video=Crop(Video,6,10,-8,-12)
#
#畫面大小調整(後面的數字根據GK中得到的自行輸入)
Video=LanczosResize(Video,640,480)
#
#字幕加載(默認為sub格式,如果是srt格式,請將Video=vobsub(video,".:\path\file")改為#Video=vobsub(video,".:\path\file"),然後去掉#Video=TextSub(video,".:\path\.srt")改為Video=TextSub(video,".:\path\.srt"))
#sub格式的(file不加擴展名)
Video=vobsub(video,".:\path\file")
#srt格式
#Video=textsub(video,".:\path\.srt")
#
#返回視頻
Return(Video)
#模板到此結束
將上面的模板拷入.avs文件(可以用寫字板創建一個avs文件),然後到VirtualDubMod打開.avs文件,就可以看到預覽效果了,如果沒有出錯,就可以放入helix進行壓縮處理。
上面只是處理某種DVD的情況,做IVTC、切邊和變形需要按照DVD的具體情況,可以參考avi的製作。那些改善畫質的濾鏡也需要按照實際情況使用。下面是tct66的一些點評。
1.截取DVD用smartripper比較好,不用考慮聲音延遲的問題
2.用azid將ac3轉成wav是對音頻處理較嚴謹且音質較好的方法
用headac3he或besweet+gui會更好些
求快就用directshowsource或用GraphEdit調用DTS/AC3解碼
3.DVD的源或多或少都有些噪點,求畫面乾淨,用convolution3d
如果是保真派,基本上加個undot
樓主給的參數,基本上保留了細節,去除了噪點
Convolution3d (preset="movieHQ") // Movie Hi Quality (good DVD source)
is an alias for Convolution3D (0, 3, 4, 3, 4, 2.8, 0)
Convolution3d (preset="animeHQ") // Anime Hi Quality (good DVD source)
is an alias for Convolution3D (0, 6, 12, 6, 8, 2.8, 0)
4.PAL的DVD基本上都是progressive,不必作deinterlace
有些是interlaced,要作deinterlace
但是有些D版的PAL制的DVD是由NTSC-film的DVD轉成PAL的DVD
這時候要作25->24還原的動作
Telecide(order=1,guide=2).Decimate(25)
NTSC的DVD就複雜很多
有film,progressive,interlaced,film混progressive,,film混progressive混interlaced
還有其它每5張的某一幅是interlaced,情況特殊,使用IVTC的方法不同
5.切邊及resize交給GK計算是方便且較正確的
7.120fps的avi壓製成RM/RMVB
首先你要看你的文件名中是否有"&"的符號,如[dmhy&ktkj][full_metal_alchemist][002][jap_chn][1170k].avi,有的話將它重新命名為例如[full_metal_alchemist][002][jap_chn][1170k].avi,不然用BRP轉出來的RMVB會為.tmp的亂碼,需手動改為.rmvb才可播放,而HPP根本不能壓制
1.使用AviSynth,
譬如說是要對120fps的wmv3.avi位於C:\
壓製成RMVB,寫一個腳本如下:
AVISource("c:\wmv3.avi")
ChangeFPS(23.976)
若第2行改為ChangeFPS(29.970),水平移動的畫面會頓,所以建議為ChangeFPS(23.976)
然後用BRP或HPP壓制這個*.avs的腳本
2.若有外掛字幕,需調用VSFilter.dll,譬如說是要對120fps的wmv3.avi及wmv3.srt位於C:\
壓製成RMVB,寫一個腳本如下:
AVISource("c:\wmv3.avi")
ChangeFPS(23.976)
LoadPlugin("VSFilter.dll")
TextSub("c:\wmv3.srt")
若其中是wmv3.idx+wmv3.sub的字幕,第4行改成
VobtSub("c:\wmv3.idx")
然後用BRP壓制這個*.avs的腳本
3.雖然這個*.avs腳本播放拖曳的時候聲音,畫面不同步,不過壓制它成RM/RMVB,沒有聲音,畫面不同步的現象