蜗牛的壳 - 后期
type: channel
link: https://www.snailium.net/tag/%E5%90%8E%E6%9C%9F/
items: 后期AVS教程(3)
items: 后期AVS教程(2)
items: 后期AVS教程(1)

后期AVS教程(3)
type: item
date: 2006-10-03T20:45:16-04:00
description: 在上一节，讲了关于如何处理120fps片源的问题。还记得最后是怎么做的吗？和Timecodes一起，把压制出来的东西封装成MKV。这里MKV是作为真正支持VFR的媒体容器使用。这样的话，片源也就可能使用MKV封装，里面混合着24fps和30fps（甚至还有60fps）的片段。AVS是不支持VFR（注：VFR就是指可变帧速率，播放的时候fps可以改变），如果还像原来那样内嵌，那么时间轴就会有困难。因为如果全部AssumeFPS（还记得这个AVS语句么？）成24或30，都会导致时间轴变得不准，那么怎么办呢？方法还是有的，上一节的片源是用D帧来占时间，那么我们人为地造出D帧来用于内嵌，内嵌好以后再把这些多出来的帧删除，问题就解决了。本节新用到的AVS语句：Directshowsource("文件名",fps=帧速率) 使用类似Windows自带的媒体播放器打开文件的方式调用片源，效率远远低于AviSource。不到万不得已请不要使用。 Selectevery(n,n1,n2,n3……) 这个是Selectevery的一个新语法，意思是以n为周期，取每一个周期里的第n1 n2 n3……帧。这可能不太好理解，举例： 片源的帧是123456789，执行了selectevery(4,1,4)就会变成1458。如果用了selectevery(1,1,1,1,1)就会变成111122223333444455556666777788889999（就是这个，变成120fps的方法）。1 、片源的加载因为这次的片源是MKV，就不能像原来那样加载了。当然，把MKV里面的AVI（如果封装的时候加入的是AVI）解出来处理是可以的，效率很高。如果解出来是其他什么格式（比如x264压制出来的MP4被封装在里面），可以考虑使用AVS的Directshowsource语句。DirectshowSource语句是加载视频的语句，与AVISource不同的是，Directshowsource使用Directshow方式加载视频（也就是WindowsMediaPlayer使用的那种加载方式）。使用Directshowsource语句加载视频最好要指定fps，比如fps=29.97。事实上，WindowsMediaPlayer配合各种Splitter（就是把封装格式解来播放用的，比如Windows自带AVISplitter）可以播放各种格式，甚至RMVB也可以。使用方法也是很简单，就像这样：directshowsource("c:\1.mp4",fps=29.97)2 、VFR的还原上一节介绍的封装MKV法，在封装MKV的时候还一起进去了个Timecodes。现在我们要利用这个Timecodes在AVS里把片源处理成120fps的，然后就和处理120fpsAVI片源一样的方法处理就可以了。首先要把这个Timecodes解出来。我考虑到很多人可能到现在还不会使用命令行，所以就写了一个小工具SMEG，专门用来解MKV（功能很弱，各位高手不要见笑）。把这个工具放在当时安装MKVToolnix的地方，然后运行即可。界面是中文的，我想我也不用多说什么，把里面的Timecodes解出来即可。利用已经讲过的语句，就可以把没有D帧的片源处理成120fps的了。首先用Trim取一段，然后用Selectevery把这一段处理成120fps，然后Assumefps到120。这个如果手工来的话也是有很大工作量，所以我也写了一个程序自动生成AVS。同样用Import命令即可。加载时片源的fps可以随意指定，在这一步片源的fps就失效了。例：生成的AVS像这样：[code] b0=trim(0,40).selectevery(1,1,1,1,1,1).assumefps(119.88) b1=trim(41,122).selectevery(1,1,1,1,1).assumefps(119.88) b2=trim(123,412).selectevery(1,1,1,1,1,1).assumefps(119.88) b3=trim(413,2624).selectevery(1,1,1,1,1).assumefps(119.88) b4=trim(2625,2836).selectevery(1,1,1,1,1,1).assumefps(119.88) b5=trim(2837,2926).selectevery(1,1,1,1,1).assumefps(119.88) b6=trim(2927,3600).selectevery(1,1,1,1,1,1).assumefps(119.88) b7=trim(3601,3840).selectevery(1,1,1,1,1).assumefps(11…

后期AVS教程(2)
type: item
date: 2006-10-03T20:42:00-04:00
description: 在内嵌的时候，经常会遇到一些很奇怪的片源。这些片源大小和普通片源看起来没什么差别，可是压缩的时候几个小时都完不成，好不容易等死等活地等完了，发现播放的时候不是卡卡的就是CPU吃了100％甚至就来“发送错误报告”了。究其原因，在打开片源的时候多留一个心眼儿，发现这个片源的FPS有点诡异（注：FPS指的是帧速率，就是每秒钟显示几张图）。看到了吗？这个FPS是119.88，也就是所谓的120fps了。事实上，这个视频文件不是真的每秒钟播放120张图，也是和普通的片源一样每秒钟播放24或30张图。不同之处在于这个AVI文件里面有一种帧，叫做“D帧”。作用是占时间，播放的时候会被忽略。这样说可能还是不好理解，还是还是排列出来就一目了然了：用K表示普通帧，D表示D帧：24fps的：K K K K K K 120fps的：KDDDDKDDDDKDDDDKDDDDKDDDDKDDDD会发现都是一样的。24fps的有6帧，播放需要0.25秒。而120fps的有30帧，播放也是0.25秒。而实际上，120fps那里只有6帧是K，也就是说两个都是一样的。那这样用24不就好了，为什么要弄一个120出来呢？是因为，还有一种常见的帧速率是30fps。当动画片种既出现30fps又出现24fps，AVI是不能一个文件拥有多种fps的。那么，就用120fps，既可以包含30fps的部分，又可以包含24fps的部分。在压制的时候，我们压制的都是K帧，如果你就这样把120fps的东西送去压制，出来的结果就是全部的D都变成K，这样怎么行？不仅播放的时候暴耗CPU，浪费压制的时间，还无意义地增大了文件地体积。在压制之前，要先把D帧去掉。本节新出现的AVS语句： selectevery(n) 每n帧取一帧。比如原来是123456789，那么用了selectevery(3)以后就会变成147。 import("文件名") 导入另一个AVS文件，效果和把这个AVS文件的代码粘贴进来一样。 assumefps(目标帧速率) 更改帧速率，不改变帧数（改变时间）。比如原来有30帧，fps由30改为24后，播放时间变为1.25秒。原理很简单，在30fps的片段用selectevery(4)，在24fps的片段用selectevery(5)。那么如何判断哪些地方是24fps，那些地方是30fps呢？从AVI中可以导出一个文件叫做timecodes，这个文件里面记录了每一个K帧出现的时间。通过这个文件，我们可以判断出哪里是帧交替点。这里介绍一个我写的自动判断的工具，把timecodes送进去它会出来一个AVS文件，里面就是刚才介绍的selectevery()语句之类的东西。在对片源加载好字幕以后，导入这个AVS即可去除所有D帧，接下来就是送去压制。例：这个是片源AVS：[code] loadplugin("c:\program files\avisynth 2.5\plugins\vsfilter.dll") avisource("[dmhy][fmp2][dvdrip][01].avi") textsub("[dmhy][fmp2][dvdrip][01].ssa") import("[dmhy][fmp2][dvdrip][01].deldf.avs") [/code]这是[dmhy][fmp2][dvdrip][01].deldf.avs[code] a0=trim(0,206).selectevery(5).assumefps(29.97) a1=trim(209,535).selectevery(4).assumefps(29.97) a2=trim(538,1983).selectevery(5).assumefps(29.97) a3=trim(1987,10833).selectevery(4).assumefps(29.97) a4=trim(10836,11891).selectevery(5).assumefps(29.97) a5=trim(11895,12253).selectevery(4).assumefps(29.97) a6=trim(12256,15622).selectevery(5).assumefps(29.97) a7=trim(15625,16584).selectevery(4).assumefps(29.97) a8=trim(16586,39557).selectevery(5).assumefps(29.97) a9=trim(39560,40007).selectevery(4).assumefps(29.97) a10=trim(40009,67039).selectevery(5).assumefps(29.97) a11=t…

后期AVS教程(1)
type: item
date: 2006-10-03T20:33:25-04:00
description: 1 、初识AVS首先必须明确，AVS是什么东西？AVS的全称是AviSynth。还记得用VDM内嵌字幕的时候是怎么做的吗？先打开片源，然后挂字幕，最后送到编码器压制。所以说到最后，VDM的工作就是给编码器提供带有字幕的视频。AVS的功能也是差不多，就是输入源视频，输出处理过的视频。AVS的处理过程全部保存在AVS文件里。对于AVS文件，我们可以把它当作是视频文件，因为安装好AviSynth以后，AVS文件可以像AVI那样被VDM打开，甚至能被播放器打开。AVS文件中包含的是处理信息。先举个简单的例子。比如之前的用VDM内嵌字幕，现在改用AVS内嵌字幕。VDM启动的时候自动加载字幕插件，先打开片源，然后添加字幕插件。用AVS的话就可以这样写：（文件名自己改）[code] loadplugin("c:\vsfilter.dll") avisource("c:\1.avi") textsub("c:\1.ssa") [/code]我来解释一下，第一句中的loadplugin()意思是加载插件，括号里面就是插件的名字。在VDM里面启动时会自动加载插件，AVS中要手动写这一句。vsfilter.dll是字幕插件的名字。然后是avisource()，这个是加载AVI的功能，就像VDM中的打开文件。textsub这个功能本来AVS没有，是加载完vsfilter.dll这个插件以后才有的。就像是VDM在没有加载字幕插件的情况下在Video->Filter里面不会出现textsub这个东西。textsub()括号里面的是字幕文件的名字。以上内容用记事本写好，保存的时候在文件名后面加上“.avs”。然后这个AVS文件拿去用播放器打开试试，播放出来有字幕的影片了吗？这样还只是出来一个AVS文件而已，字幕并没有真正跑到影片里面去。刚才看到的是AVS输出的画面，只要把这个画面拿去压制就可以出来有字幕的文件了。可以使用VDM进行压制。在VDM打开文件的时候，直接选择AVS文件，然后不要再挂字幕了，设置好以后送去压制就可以了。2 、特效的内嵌AVS强大的功能还不止这一点，现在再介绍复杂一点的AVS操作。比如特效，字幕组的人经常会把特效制作成AVI格式或者字幕格式。如果是字幕格式，那好办，用AVS就这样写：[code] loadplugin("c:\vsfilter.dll") avisource("c:\1.avi") textsub("c:\1.ssa") textsub("c:\tx.aas") [/code]和刚才相比，就多了一句，再加载一次字幕而已。如果是AVI的特效，比如是片头，就是去掉原来动画片的片头，把这个AVI塞进去充当片头。就是说用AVI里面的内容替换片源的内容。先要找到片源中要替换的部分的位置。这个用VDM操作。用VDM打开片源，拖动下面的滚动条找到片源中要替换部分的开头，这里的开始位置就是361，记住这个数字。然后用同样的方法找到结束位置，这里找到的是2519。再把滚动条移动到最后面，找到总帧数，这里是35963。然后找出那个AVI特效。这里假设片源是c:\py.avi，字幕是c:\zm.ssa，特效是c:\tx.avi。[code] loadplugin("c:\vsfilter.dll") py=avisource("c:\py.avi",audio=false).textsub("c:\zm.ssa") tx=avisource("c:\tx.avi",audio=false) py.trim(0,360)+tx+py.trim(2520,35963) [/code]这个AVS会相对比较复杂。解释一下：[code] loadplugin("c:\vsfilter.dll") #加载字幕插件 py=avisource("c:\py.avi",audio=false).textsub("c:\zm.ssa") #加载片源并挂字幕 tx=avisource("c:\tx.avi",audio=false) #加载特效 py.trim(0,360)+tx+py.trim(2520,35963) #用特效代替片源中的部分 [/code]和前面相比，又多了一些东西。在加载片源语句中，多了一个audio=false，这个的意思是加载片源的时候不加载音频。以此类推，加载特效的时候也没有加载音频。音频的话可以在最后压制好再混合。这样就直接在AVS里面禁掉了音频，不用在VDM里面选audio->No audio了。加载语句的后面跟了一个点，然后是加载字幕。点的作用是分割，意思是加载好片源以后紧跟着挂字幕。为的是写在同一行。写在同一行的理由在这一行的开头，就是那个py=。它的意思是这一整行出来的结果用py表示。下面的也是，特效加载好以后用tx表示。接…