AviSynth初步了解

视频编辑

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

线性编辑:

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

转载请注明: 转载自MeGUI中文版博客

本文链接地址: http://keith70.u.sourceforge.net/?p=407

posted on 2012-02-17 20:51  keith70  阅读(589)  评论(0编辑  收藏  举报

导航