AviSynth2.5初步了解

来自NMM Doc
跳转至: 导航搜索

视频编辑

  基本上来说,AviSynth是这样工作的:首先,你会创建一个包含命令的简单文本文档,它叫做脚本。这些命令代表若干个你想要的视频以及想要运行的滤镜。然后,当你运行一个视频程序,例如VirtualDub,并且打开刚才的脚本时,AviSynth就会运作起来。它会加载脚本中的视频,并且运行指定的滤镜,然后将结果输出给视频程序。然而视频程序并不知道AviSynth在后台运行,而是以为自己在直接读取一个硬盘上的AVI文件。

  AviSynth2增加了很多新功能,为了突出这些功能(尤其因为他们在以前的文章中都没有被完好阐述过),我们在这篇文章中把它们标记为v2

  由于v2.5在内核上做了较大的升级,请在使用前仔细阅读AviSynth v2.5。相关升级都被标记为v2.5

线性编辑:

  在AVISynth里能做的最简单的事就好比在VirtualDub里的编辑视频。因为这些语句都太好写了,不需要担心变量以及复杂的表达式。

  作为测试,请先创建一个文件命名为“test.avs”,然后输入如下一行文字:

Version

  现在用Windows Media Player或其他来打开这个文件,你会看到一个10秒钟的写有AVS版本号及版权信息内容的视频片段。

  Version叫做“源滤镜”,这意味着它的作用是生成片段而非修改。在AVISynth脚本中第一个命令永远是源滤镜。

  现在加入第二句,让它看起来是这样:

Version
ReduceBy2

  在Media Player中再次打开这个文件,你应该还可以看到那些版权信息,不过只有以前的一半大小。ReduceBy2是一个“变换滤镜”,它会以某种方式改变原有的视频片段。你可以连续使用多个变换滤镜就好像在VirtualDub里一样。

  让我们再加一句使视频变成淡出至黑色的结尾,它应该是这个样子:

Version
ReduceBy2
FadeOut(10)

  现在再次打开文件,片段的前9秒应该是一样的,而最后一秒会平滑的淡出到黑色。

  FadeOut滤镜需要一个数值,用来代表淡出所需的帧数。

  渐变开始之前的时间太长了,所以我们需要修剪视频的起始部分以减少等待的时间。

  我们扔掉前120帧,保留120-150帧:

Version
ReduceBy2
# 砍掉前119帧,保留120-150帧
# (AVISynth的起始帧数是从0算起的)
Trim(120,150)
FadeOut(10)

  在这个例子中,我们第一次使用了注释。

  注视以”#”开头,一直到最后一个字母结束,是被AVISynth完全忽视掉的。Trim滤镜需要两个数值,以逗号“,”(英文半角,AVS脚本内一切皆为英文半角)分开,两个数分别代表视频中要保留的起始帧和中止帧,若最后一帧输入的是0,就代表到视频片段的最后一帧。所以如果要砍掉前119帧,可以输入Trim(120,0)。

  像这样把帧数仔细记录真是一件麻烦事,在VirtualDub等这样的程序里直接打开一个部分完成的脚本就方便多了,它会把帧数都为你显示出来。你还可以用ShowFrameNumber滤镜,它会把帧数直接打在视频上。

  其实实际使用中在AVISynth里有一个比Version实用很多的源滤镜,就是AVISource,它用来从硬盘中读取一个AVI(或其它视频格式)的文件。如果你手头上已经有了一个AVI文件,那么你可以试试把这些相同的滤镜加到你的文件上。

AVISource("d:\capture.avi")  # 这里要写你实际的路径和文件
ReduceBy2
FadeOut(15)
Trim(120,0)

  只有单独一行AVISource命令的脚本可以为只支持小于2GB文件的视频程序提供大于2GB文件的支持。


非线性编辑:

  好了我们到了有趣的部分了,建立一个有如下语句的AVS文件:

StackVertical(Version, Version)

  打开它,结果是这样:输出的视频中有两行一模一样的版本信息,一行在另一行之上。

  StackVertical不需要数值或是字符串作为参数,而是需要视频剪辑。在以上语句当中Version滤镜被两次调用,每一次都返回给StackVertical一个版本信息的视频,于是StackVertical把它们拼在一起(不管那视频从哪儿来的)。

  UnalignedSplice也是有用的此类滤镜之一,它可以将视频剪及首尾相接,这段语句就是将3段视频(例如可能是AVI_IO生成的)读取并连接在一起:

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"))

语法

表达

  一个AVISynth的脚本当中会有形如以下的陈述:

variable_name = expression  (变量名 = 表达)

  在这个例子当中expression被求值并将结果赋予variable_name

  还有一个很重要的省略形式:

expression

  以上语句当中expression被求值并将结果赋予一个特殊的视频片段变量last。

  功能与以下语句相同:

last = expression

  结尾通常是这样:

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)