基本语法
赋值
variable_name = expression # (变量名 = 表达)
在这个例子当中expression
被求值并将结果赋予variable_name
还有一个很重要的省略形式:
expression
以上语句当中expression
被求值并将结果赋予一个特殊的视频片段变量last
。
功能与以下语句相同:
last = expression
换行
AviSynth对换行敏感,如果同义句命令被放在了不同行,则应用\
来连接
vid1 + vid2
i.e.
vid1 + \
vid2
结尾/返回值
结尾通常是
return expression
在这里expression
被求值并用作了这个脚本的返回值,也就是说,若这个AVS文件被打开,视频程序看到的仅是这个值的视频片断。
若返回值没有被特意指派,那么last
的值就会被用作返回值。
函数调用
基本的调用函数的表达如下:
Function(args) # 函数(参数)
视频剪辑函数从来都是创建一段新视频而不更改现有视频。
args
是一串以逗号“,”分隔开的函数参数列表,这个列表可以是空的(意味着所有参数或者部分参数可选)。
如果滤镜函数的第一个参数是一个视频剪辑,并且这个视频剪辑并没有被提供,那么将用特殊变量last来替代。
AVISynth的滤镜可以识别指定参数(arg=expression)
,它们之间的顺序可以随意调换。没有被指定的参数将使用默认值,这会使某些滤镜用起来简单些。
例如,你可以写
Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)
而不一定要
Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)
滤镜的调用
Avisynth的滤镜分为两种:内置滤镜(核心滤镜)和扩展滤镜,内置滤镜不需要调用。
当扩展滤镜放在C:\Program Files (x86)\AviSynth\plugins文件中时,扩展滤镜也不需要语法调用,AviSynth会自动调用。
LoadPlugin("插件绝对路径")
属性
Clip属性
在AVS脚本中可以得到clip属性
Width(clip) 返回clip在宽度方向的像素数(类型:整数)。
Height(clip) 返回clip在高度方向的像素数(类型:整数)。
Count(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(假)(类型:布尔)。 作者:PIXIV日推-每日更新 https://www.bilibili.com/read/cv868301 出处:bilibili
源滤镜
Version
Version
可以获得一个显示avs版本的视频。
优先尝试
AVISource
,如果不行,再尝试FFmpegSource
和LSMASHSource
。最后可以尝试DirectShowSource
.
AVISource
AVISource()
参数为文件的位置。
注意:AVI只是一种容器而非编码格式。AVI可以包括很多编码,例如MJPEG,VXID等。
FFmpegSource
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\ffms\ffms2.dll")
先加载插件
FFVideoSource
FFVideoSource(Route)
加载视频
FFAudioSource
FFAudioSource(Route)
加载音频
封装
AudioDub( FFVideoSource(X), FFAudioSource(X) )
例如
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\ffms\ffms2.dll")
inputPath = "Fumetsu no Anata e - 20 raw.mkv"
AudioDub(FFVideoSource(inputPath), FFAudioSource(inputPath))
DirectShowSource
通过DirectShow打开媒体文件。支持很多AVIsource不支持的格式。
DirectShowSource(string filename [, float fps, bool seek, bool audio, bool video, bool convertfps, bool seekzero, int timeout, string pixel_type, int framecount, string logfile, int logmask ] )
变换滤镜
缩小一半ReduceBy2
将视频横竖尺寸均减小一半。
HorizontalReduceBy2
视频宽度减半
VerticalReduceBy2
视频高度减半
ReduceBy2的三个滤镜,既可以不带参数,也可以带参数。
vid1=AVISource("scr.avi")
ReduceBy2
ReduceBy2(AVISource("scr.avi"))
裁剪Crop
Crop(clip clip, int left, int top, int width, int height [, bool align ] )
crop可以裁剪原视频,传入的坐标参数为左上的x,y坐标和裁剪后视频想要的宽高。
重调分辨率Resize
vs中内建的resize滤镜有Bicubic, Bilinear, Spline16, Spline36, Lanczos等等。
区别在于:[1]
如果您要放大视频,使用BicubicResize 可以获得比使用 BilinearResize更清晰的结果。但是,如果您要缩小它,您可能更喜欢BilinearResize,因为它会执行一些抗锯齿。
LanczosResize的画质更锐利和真实,适合普通电影;而SimpleResize的画质较柔和,适合动画。
重调前的裁剪
所有的大小调整有一个扩展语法,裁剪crop
尺寸调整前的框架:
BilinearResize(100, 150, src_left =10, src_top =10, src_width =200, src_height =300)
也可以简写为
BilinearResize(100, 150, 10, 10, 200, 300)
当然也可以先写crop
滤镜
Crop(10, 10, 200, 300).BilinearResize(100, 150)
双线性缩放BilinearResize
BilinearResize使用标准的双线性滤镜
BilinearResize(240,180)
双立方缩放BicubicResize
BicubicResize(双立方缩放)和BilinearResize相似,区别在于用Mitchell-Betravali的两部分立方算法代替了双线性滤镜。参数b和c用于调整两次立方的特性,某些时候分别指“blurring”和“ringing”。
当b = 0和c = 0.75时,这个滤镜和VirtualDub的“precise bicubic”完全一样,得到的结果也是完全一样的,除了上述的VirtualDub缩放问题。默认参数b = 1./3.、c = 1./3.,此参数是Mitchell和Netravali在人眼主观测试综合最满意的结果才得到的。增大b和c的值会得到有趣的反艺术效果——比方说试试b = 和 c= -5。
如果放大视频,用BicubicResize比BilinearResize得到的画面更好看。然而在缩小时,用BilinearResize可能和BicubicResize一样,甚至优于BicubicResize。尽管VirtualDub的bicubic滤镜比linear的效果好,但这是因为bicubic滤镜锐化了图像,而不是因为形状更好。比较锐利的图像看起来很舒服——但在压缩时非常容易出瑕疵。BicubicResize的默认参数不像VirtualDub那样锐化,但依然比bilinear锐利。若像压低码率的视频,用BilinearResize得到的结果整体较好也很正常。
为了最精确的数值,滤镜里b和c必须满足如下关系:
b + 2 * c = 1
因此当b = 0时c可以取最大值0.5,这其实是Catmull-Rom样条曲线。这是一个可以得到较锐利图像的推荐值。
c > 0.6后滤镜开始“ring”了。这不是真正的锐利,相反会得到像电视的锐化控制一样的效果。b不能取负值,当c > 0,5时,b取0。
Spline缩放
好像比较常用?
这三个缩放滤镜基于样条插值算法。(v2.56/v2.58加入)样条差值算法可以尽可能的锐化图像,同时产生的ringing瑕疵也比LanczosResize少。Spline16Resize用sqrt(16)=4个采样点,Spline36Resize用6个采样点,Spline64Resize用8个采样点。采样点用的越多,图像就越锐利。对比测试见此。
Spline36Resize(Output,960,540)
淡入淡出FadeIn / FadeOut
FadeIn(frameNum)
FadeOut(frameNum)
视频前/后frameNum
帧淡入/淡出
注意:AVISynth的起始帧数是从0算起的
截取Trim
Trim(startFrm,endFrm)
从第startFrm
截取到第endFrm
帧。
若endFrm
输入的是0,就代表到视频片段的最后一帧。
加黑边AddBorders
AddBorders( clip clip, int left, int top, int right, int bottom [, int color ] [, int color_yuv AVS+])
addborders(左,上,右,下)加黑边,上下加黑边
例如,把一段1280×720的视频上下裁剪各100像素,再加上黑边,再缩放为960×540,则脚本应为
AudioDub(FFVideoSource(inputPath), FFAudioSource(inputPath))
Crop(0, 100, 1280, 520)
addborders(0,100,0,100)
Spline36Resize(960,540)
显示帧数ShowFrameNumber
直接把帧数显示在视频中。
显示实时播放信息Info
Info()
多视频排布StackVertical
将视频垂直堆叠
StackHorizontal
类似,将视频横向堆叠
# show clips in variables a,b,c,d in a box like this:
# a b
# c d
StackVertical(StackHorizontal(a, b), StackHorizontal(c, d))
非线性连接UnalignedSplice
将视频剪辑首尾相接
UnalignedSplice(clip1,clip2,...)
例如
UnalignedSplice(AVISource("d:\capture.00.avi"), \
AVISource("d:\capture.01.avi"), \
AVISource("d:\capture.02.avi"))
也可以用+
来简化连接视频,例如
UnalignedSplice(clip1,clip2)
可以简化为
clip1 + clip2
音频延迟DelayAudio
DelayAudio 使音频延迟由“秒数”值决定的时间。“秒数”可以为负数或分数。
# 使音频提前半秒
DelayAudio(-0.5)
混流封装AudioDub
混流不同的音视频
# Load capture segments from patched AVICAP32 which puts
# video in multiple AVI segments and audio in a WAV file
video = AVISource("capture1.avi") + AVISource("capture2.avi")
audio = WavSource("capture.wav")
# combine them into a single clip
AudioDub(video, audio)
字幕Textsub
需要挂载Vsfilter滤镜
可以挂入srt, sub, psb, smi, ssa, ass文件格式的字幕
TextSub (clip, string "file", int "charset", float "fps", string "vfr")
反转剪辑Reverse
Reverse()