后期AVS教程(2)

在内嵌的时候,经常会遇到一些很奇怪的片源。这些片源大小和普通片源看起来没什么差别,可是压缩的时候几个小时都完不成,好不容易等死等活地等完了,发现播放的时候不是卡卡的就是CPU吃了100%甚至就来“发送错误报告”了。究其原因,在打开片源的时候多留一个心眼儿,发现这个片源的FPS有点诡异(注:FPS指的是帧速率,就是每秒钟显示几张图)。

2_后期avs教程2-1.jpg

看到了吗?这个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=trim(67043,67361).selectevery(4).assumefps(29.97)
a12=trim(67364,71610).selectevery(5).assumefps(29.97)
a13=trim(71613,71875).selectevery(4).assumefps(29.97)
a14=trim(71878,74128).selectevery(5).assumefps(29.97)
a15=trim(74132,75650).selectevery(4).assumefps(29.97)
a16=trim(75653,84143).selectevery(5).assumefps(29.97)
a17=trim(84147,85105).selectevery(4).assumefps(29.97)
a18=trim(85108,158948).selectevery(5).assumefps(29.97)
a19=trim(158952,166138).selectevery(4).assumefps(29.97)
a20=trim(166141,167496).selectevery(5).assumefps(29.97)
a21=trim(167500,167795).selectevery(4).assumefps(29.97)
a22=trim(167797,169696).selectevery(5).assumefps(29.97)
a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16+a17+a18+a19+a20+a21+a22
[/code]

虽然这个看起来复杂,但是是没有奇怪的语句,而且是程序自动生成,不用自己写。

为什么要先挂字幕,而不先去除D帧呢?因为D帧是用来提供24fps和30fps混合的,去掉D帧fps会混乱,字幕的时间就不准了。

这里介绍一下这个删除D帧的AVS的取得办法:

首先用附带的工具取得timecodes。方法是把AVI文件拖动到avi2timecode的图标上,一个TXT就会出来。然后把这个TXT拖到120tcv2toavs图标上,这个AVS就会出来了。

最后压制完时间还是不准的,要进行处理。这里推荐封装成MKV格式。压制出来有一个视频文件,片源中解出来音频文件,然后和timecodes一块儿封装到MKV里面。

封装MKV用的是MKVToolnix,封装方法:

首先启动mkvmerge GUI(这个软件启动比较慢,耐心点),然后加载压制成品和音频,在轨道那里选中视频:

3_后期avs教程2-2.jpg

下方找到这个:

4_后期avs教程2-3.jpg

把一开始用avi2timecode生成的那个TXT文件弄到这里,然后和平时一样照常封装即可。

附:封装MKV的方法

MKV类似于AVI,是一种封装格式,说白了就是给音频流和视频流提供放的地方。MKV要比AVI先进,比如AVI的120fps是为了使24fps和30fps的得以混合,而MKV自身就是可以支持24fps和30fps混合的,不需要借助什么120fps。MKV还有很多比AVI先进的地方,大家还是慢慢体会吧。如果没有什么视频基础知识,要播放MKV我推荐使用MediaPlayerClassic,播放方法和播放普通的视频没什么区别。这里介绍一下MKV的制作方法。

制作MKV通常是借助一个叫做MKVToolnix的工具。首先下载下来安装,运行那个mkvmerge GUI就会出现如下窗口:

5_后期avs教程2-4.jpg

按照上面说的操作就可以了……

添加新评论