AviSynth是由Ben Rudiak-Gould首创的一种非常有用的工具,能够提供各种方式来合并和滤镜处理影像文件。最独特的就是AviSynth并不是一个孤立的影像处理程序,而是在影像文件和应用程序之间担任“中间人”的角色。
AviSynth官方网站:http://avisynth.nl/index.php/Main_Page
AviSynth官方版本:AviSynth 2.58 、AviSynth 2.60 、 最新的版本是AviSynth 2.6.0.1 Alpha 2(单线程ST,且只有32bit)
AviSynth非官方版本:Avisynth 2.6 MT(MT多线程32bit)、 Avisynth 2.5.8 MT(MT多线程64bit,已弃用)、AviSynth+(多线程32bit&64bit)
AviSynth基本工作原理:
首先建立一个包含特定命令的文本,称之为“脚本”(后缀为avs),这些命令指定要运行处理的影像文件和滤镜;然后运行影像应用程序,比如VD或ND,打开脚本。此时AviSynth就开始工作了,打开脚本中指定的影像文件,运行特定的滤镜,并把输出结果提供给影像应用程序。但影像应用程序并不了解AviSynth在后台所做的处理,而认为是直接打开了一个“被处理过”的影像文件。
以上所说的滤镜也称插件,可以实现各种各样视频处理功能如读/写媒体文件、改变颜色空间类型或者调整一段视频中的颜色、改变图像尺寸、处理图像边缘或对视频进行其他几何变化、以时间为纲调整视频中的各帧(视频裁剪、合并和其它操作)、处理音频、降噪、去色带等等。Avisynth的滤镜分为两种:内置滤镜(核心滤镜)和扩展滤镜,内置滤镜不需要以LoadPlugin ( "插件绝对路径")来调用滤镜。当扩展滤镜放在C:\Program Files (x86)\AviSynth\plugins文件中时,扩展滤镜也不需要LoadPlugin ( "插件绝对路径")来调用滤镜,AviSynth会自动调用。
AvsPmod:书写AviSynth脚本的IDE,带有代码补全功能以及语法高亮功能。最主要的是具有视频预览功能,可以查看视频处理后的效果。
AvsPmod下载:https://avspmod.github.io/ 汉化版:http://nmm.me/11c
所有基本的Avisynth脚本声明都符合以下的某种形式。
第一种情况,计算表达式的结果,赋给变量名。第二种情况,计算表达式的结果,如果类型是Clip,则赋给一个特殊的变量last。第三种情况,计算出的表达式成为活动脚本的“返回值”——可以是一个函数的“返回值”,也可以是整个脚本的“返回值”。
绝大多数时间,表达式的结果是一个视频Clip,但实际上表达式的结果可以是本脚本语言支持的任何类型(Clip、整数、浮点、布尔、字符串)
一个表达式有如下的一种形式:
第一种情况,表达式的值就是常数的值。第二种情况,值和Clip属性或语法:脚本变量有关(之前必须经过初始化)。第三种情况,值是AVS函数的返回值(见下文)。第四种情况,是一个替代的写法,(成为“OPP记号”),和函数(表达式,参数)等价。最后两种情况,可以使用普通的算数和逻辑运算符号(来自C)操作表达式,计算整数、浮点和布尔
Avisynth忽略每行#后面的任何字符。这个功能能用来在脚本中添加注释。
Avisynth忽略大小写:aViSouRCe和AVISource等效。
变量类型:clip (剪辑)、string (字符串)、int (整数)、float (浮点)、bool (布尔)、val (变量)
clip (剪辑):一个视频片段包含视频轨和/或音频轨。一个脚本返回的值必须是这种类型。
string (字符串):一串代表文字的字符序列。字符串的写法是把字符用“引号”或“三重引号”括起来。
int (整数):一个整数。输入一串数字,成为一个整数变量。在数字前面也允许有正号(+)或负号(-)。
float (浮点):有小数点的数。输入一串包含小数点的数字,成为浮点变量,也可以有正号(+)或负号(-)。
bool (布尔):布尔值必须是“true”(真)或“false”(假)。
val (变量):一个通用类型的名字。只能用在自定义脚本函数的变量列表里,目的是为了能够声明一个任意类型(int、float、bool、string或clip)的参数变量。必须明确它的类型(用布尔函数),再做恰当的处理。
变量可以是局部的(限制在正在执行的脚本的局部尺度)或是全局的。全局变量的范围是所有脚本环境的尺度,所有内部函数、用户定义函数、运行环境脚本和主脚本都可以访问。要定义和/或给一个全局变量赋值,在赋值语句中,变量名的左边必须添上关键字“global”。在读取全局变量是,并不需要(实际上也不允许)写这个关键字。
想要声明一个变量,仅仅需要在变量名称之后加上“=”(等号),再加上初值就够了。类型不必声明;类型靠给它赋的初值确定(而且也能被以后的赋值语句改变)。唯一允许声明变量类型的地方只有用户定义函数脚本的参数列表里(虽然没有严格要求)。比如:
<span style="color:#000099">b = false # 声明了一个初值是“false”(假)的布尔变量,变量名是“b”
x = $100 # 整数类型(初值是十六进制)
y = 256 # 整数类型(初值是十进制)
global f = 0.0 # 浮点类型的全局变量
...
function my_recolor_filter(clip c, int new_color, float amount, val "userdata") { ... }</span>
== 等于
!= 不等于
<> 不等于(和!=等效,v2.07)
对于数值类型的变量(整数、浮点),可以使用下面的整数/浮点专用运算符号
+ 加
- 减
* 乘
/ 除
% 取余数
>= 大于或等于
<= 小于或等于
< 小于
> 大于
对于字符串类型的变量,可以使用下面的字符串专用运算符号
+ 合并
>= 大于或等于(v2.07)
<= 小于或等于(v2.07)
< 小于(v2.07)
> 大于(v2.07)
对于剪辑类型的变量,可以使用下面的剪辑专用运算符号
+ 非对齐连接
++ 对齐连接
对于布尔类型的变量,可以使用下面的布尔专用运算符号
|| 或
&& 与
?: 条件执行
条件执行运算符号示例:
b = (a==true) ? 1 : 2 #如果 (a=true) 那么 b=1 否则 b=2
用户自定义脚本函数以关键字“function”开始,后跟函数名。脚本函数命名规则和脚本变量规则一致。函数参数列表紧随函数名之后。列表(可以为空)以(所期望的参数类型 - 参数名)对组成。各参数类型可以是AviSynth支持的任意变量类型。函数能返回任意的变量类型。然后是函数主体,也就是每次调用函数时执行的代码。参数在函数主体内按名称进行访问。函数主体由一对大括号{...}括起来。在函数主体的结尾处,需要有一个return声明,返回从参数和函数主体中计算出的最终结果。AviSynth的函数只能包含单个返回声明
一个用户自定义脚本函数是一个独立的脚本代码模块,每调用一次脚本中的函数,都会执行这个脚本代码一次。
AviSynth语法只提供了一种控制结构(实际上有两种,另一种是条件运算符号,? :,用在其他地方),那就是 try...catch 声明
try...catch声明允许执行代码时产生可能的错误,并当错误发生时处理此错误。
完整的 try...catch语法表述如下:
<span style="color:#000099">try {
...
statements
...
}
catch(err_msg) {
...
statements
...
}
</span>
在catch区块中的字符串err_msg包含了AviSynth在执行try区块时产生的错误信息。这些文字和我们熟悉的当脚本发生严重错误的时候信息盒子里显示的错误信息一样。
可以查询这些文字(也就是普通的字符串变量)去查找特定的子字符串,判断发生的错误。
在AVS脚本中可以得到clip属性
Width(clip) 返回clip在宽度方向的像素数(类型:整数)。
Height(clip) 返回clip在高度方向的像素数(类型:整数)。
FrameCount(clip) 返回clip的帧数(类型:整数)。
FrameRate(clip) 返回clip每秒的帧数(类型:浮点)。在内部,帧数作为一个比值储存
AudioRate(clip) 返回clip的音频的采样率(类型:整数)。
AduioLengthF(clip) 返回clip的音频的采样数(类型:浮点)。
AudioChannels(clip) 返回clip的音频的声道数(类型:整数)。
AudioBits(clip) 返回clip的音频的bit depth(类型:整数)。
HasAudio(clip) 如果clip有音频,则返回 true(真),否则返回 false(假)(类型:布尔)。
HasVideo(clip) 如果clip有视频,则返回 true(真),否则返回 false(假)(类型:布尔)。
LoadPlugin("ffms2.dll绝对路径") #调用ffms2滤镜,该滤镜用来加载视频源
FFVideoSource("source.mkv绝对路径") #使用ffms2滤镜的FFVideoSource函数加载视频源
selectrangeevery(1800,96,7000) #selectrangecvcry()截取视频片段,从7000帧开始,每1800帧取96帧
addborders(0,132,0,132) #addborders(左,上,右,下)加黑边,上下加132像素黑边
Spline36Resize(960,540) #Spline36Resize()将视频尺寸缩放至960*540