雷鸣视频制作全教程- 8- 帧速率可变型片源的内嵌

发布时间:2011-12-13 16:59:52   来源:文档文库   
字号:

帧速率可变型片源的内嵌

by 雷鸣 2007-01-25

(本文中调整时间轴的程序部分代码受MeteorRain指导而经过优化)

  看完前面的文章,我想大家应该也会做一些简单的字幕了吧?可能在这个过程中,遇到这样的问题:从MKV里面解出来的AVI视频流怎么播放一下子快一下子慢?或者这个AVI的帧速率怎么这么快?这个时候,可能就是遇到帧速率可变的片源了。

  在前面一节制作DVDRip的文章中讲到,有的DVD片可能中间既有24fps又有30fps的部分,当时是说以大局为重统一使用24fps。但是,有些追求完美的人不能够忍受把30fps的部分做成24fps,于是发明了各种各样的方法。其中以AVI做成120fpsMKV做成VFRVFR即可变帧速率)最多。由于AVI120fps法出现比较早,没有MKVVFR来得完善,所以本篇介绍的方法,最后结果都是得到MKV文件(也就是做成VFRMKV)。

  经过前面几篇的操作,我想大家应该对这些东西渐渐熟悉了吧,那么本篇主要介绍一些理论知识,操作就由大家自己去完成了。

  先讲讲120fpsAVI。如果在24fpsAVI的每一帧(就是每一张图)后面加上4张一模一样的图,然后再用5倍速度播放,得到的画面和原来完全一致,但是播放速度变成了120张图每秒。同样地,在30fpsAVI的每一帧后面加上3张一模一样的图,然后用4倍速度播放,得到的画面也是和原来完全一样的,播放速度也变成了120fps。那么,分别对24fpsAVI30fpsAVI作此处理,然后合并起来,再统一用120fps的速度播放,就实现了30fps的部分和24fps的部分混合在同一个文件中了(因为AVI播放过程中不能变速)。实际上制作的时候,并不是把相同的图象这么加进去,而是直接加入没有人和信息的帧,这些帧不会被播放出来(因为本身就没有内容),但是却占了时间。用VDM打开这个AVI时,VDM会把这些没有内容的帧当作和之前有内容的帧一样的帧来处理,结果是压缩的时候,编码器必须编码几倍的画面,不仅对于速度还是对于空间,都是一种浪费。

  这样说可能还是有点复杂,那么举个例子来说明。有一个AVI文件,总播放时间是三分之一秒,速度是30fps,所以总共含有的帧数就是30×0.3333310帧。把他们排列出来:

  0123456789

  如果在每一帧后面加上3个空帧(用D表示),那么就会变成

  0DDD1DDD2DDD3DDD4DDD5DDD6DDD7DDD8DDD9DDD

  数一数,总共有40帧。如果用120fps的速度来播放,那么它的总时间就是40÷120=0.33333(),可是有效帧的数量还是10

  这样算来,完全没有变化。但是这种片送去压缩的时候,VDM会把D也当作有东西的帧来处理,那么压缩好以后有效帧的数量就会变成40,工作量为4倍。播放的时候,本来只要播放10帧,现在却要播放40帧,可能有的电脑就要开始崩溃了。

  确实有专门的软件可以用来删除AVI文件中的D帧,但是就算去除了D帧,片子也是不能拿来内嵌。前面说过AVI不支持多种帧速率同时出现在一个文件中,所以删除D帧以后,对于这既有24fps又有30fps的片,无论用什么速度播放,影片的速度都不会正常的。

  MKV由于自身的特性,本身就是支持多种帧速率在同一个文件中出现。但是用过VDM后发现,VDM根本就不能打开MKV(新版本的也是不能支持VFR),如果把MKV里面的AVI视频解出来,又会遇到相同的问题了:一个AVI文件只能有一种速度。

  这些理论知道了,方法也就很简单:因为MKV里面解出来的AVI或去除D帧的AVI按照一个一定的速度播放,速度会忽快忽慢。那么,只要把时间轴也调整成忽快忽慢的,就可以正常内嵌了。内嵌完毕,再把速度调回来,不就完了吗?

首先是AVI。如何判断一个AVI文件是不是120fps的呢?实际上很简单,VDM就能办到。用VDM打开要内嵌的AVI,选择File Information选项,然后一个窗口弹出来,看看是不是写着119.88fps

  由于MKV本身支持VFR的特性,所以VFRMKV并没有像119.88fps等标志可供识别。MKVExtract这个工具之前用过了吧?前面用它来解MKV里面的声音、图象等。现在用它来解Timecodes v2Timecodes v2:一种文件,里面详细记录了每一帧什么时候播放)。把timecodes拿来分析一下,就可以很容易知道这个MKV是不是VFR的了。

打开命令提示符,进入要存放timecodes的文件夹(前面提到过,输入cd /d 然后拖入文件夹并回车),然后拖入mkvextract的程序文件,敲空格,输入timecodes_v2再空格,拖入MKV文件,空格,打入 1(冒号) 然后输入要保存timecodes的文件名(扩展名为txt),输入好以后大概象这样的:

  按一下回车,timecodes文件就解出来了。

然后对它进行分析。在附带工具里面,可以在tctool文件夹找到一个名为tcv2anal的程序,就是专门用来分析Timecodes文件的工具。双击这个程序,选择刚才解出来的timecodes文件,结论就会出现。比如例子中解出来的那个timecodes,就会弹出如下对话框:

  结论很明显。

  但是对于非VFR的片源,如果AVI解出来以后发现播放时间改变了,那么还要进行FPS调整。调整方法可以参考下面的步骤,但是注意,要输入的数字是最接近目标FPS的整数乘上1000然后加1,比如目标是29.97那么就用30*1000+1=30001。调整好以后,就当成普通的AVI处理即可。

  对于VFR的片源,还有一件事情要做,就是把片源的播放速度调整到一个自己好处理的值,比如23.976就不错。因为封装进MKV,只要有timecodes在,播放速度就不会出问题。但是现在解出来了,就要好好思考播放速度的问题了。

  那么就把解出来的AVI播放速度改为23.976。在附带工具中可以找到一个叫做avifrate的,就是用来快速更改播放速度的。

但是,这个工具有一点非常不好,它对于中文的Windows支持甚烂。一个简单有效的方法,把这个工具的文件夹复制到某个分区的根目录中再打开,例如复制到C:\下。

启动avifrate,点击File菜单的Open,选择刚才解出来的AVI文件打开,然后在下图所示的方框中输入24001(为什么不是24000呢?Avifrate有个很奇怪的问题,你按一下鼠标它就给你减掉1……原因不明),然后点击右边的Apply按钮。会弹出一个对话框让你确认一下。点击对话框中左边那个按钮,播放速度就更改完成了。

  刚才解出来的Timecodes要留住,一会儿校准时间轴要用到。

  那么如果片源是120fpsAVI,那么该怎么办呢?这里要用到一款工具,是SSWROOM写的AVIRead,用于处理120fpsAVI很不错。附带的工具中有。(有一种情况,就是从MKV里面解出来的AVI120fps的,这个时候也按照120fpsAVI的片源来处理,比如动漫花园的AIR

  打开AviRead,然后点击菜单的Window->Open File,打开120fpsAVI文件。因为音频视频分开处理,所以先去除音频流,点击View菜单的Audio Streams,会弹出一个音频流的窗口。分别选中里面的每一个点击右边的Remove按钮去除,完成后点下面的OK按钮,完成音频流的去除。

  然后导出帧列表。帧列表在这里的用途就相当于MKV里面解出来的Timecodes,但是AVIRead不支持直接从AVI中导出Timecodes。没关系,附带的工具中有一个工具就是专门用于把导出来的帧列表转换成Timecodes的工具(前面说过了,调整时间轴的时候要用到,还有最后封装成MKV的时候也要用到)。

  点击File菜单的Export Frame List按钮,会弹出保存文件的窗口。保存完帧列表文件以后,把它转换成Timecodes格式。在附带工具的tctool文件夹下面找到fltotc2,启动,选择刚才导出来的帧列表,帧列表就会被转换成timecodes格式,保存在同一个文件夹下(到保存帧列表的文件夹中看看多了什么文件就知道了)。

到现在还没对AVI进行处理呢。点击Edit菜单的Remove Drop Frames,会弹出一个窗口,直接点击窗口中的OK,所有空帧就会被删除。然后像对待MKV解出来的AVI那样调整播放速度到23.976,不过AVIRead中有这个功能,就直接在AviRead中完成。点击Edit菜单的Change Frame Rate,会弹出一个窗口,在图片中红色部分的方框里面填上24000,点击OK,操作完成,把AVI另存为(切记不要覆盖片源),选择File菜单的Save As,保存处理过的AVI文件。

  做完以上步骤以后,无论是VFRMKV片源还是120fpsAVI的片源,都可以获得一个Timecodes文件和一个播放起来忽快忽慢的AVI文件。这个AVI文件准备拿来嵌字幕。但是时间轴还没有调整,直接往AVI里面嵌字幕的话时间轴肯定不准。那么现在,就把时间轴调整成和片源一样忽快忽慢。

  用SubCreator做完字幕以后,先别急着导出。保存成SubCreator的专有格式以后,拿这个文件去调整,调整完以后再导出成SSA,然后内嵌。方法是,把之前得到的Timecodes文件和SubCreator的专有格式文件放在同一个文件夹下,然后两个都选中,鼠标把其中的那个SubCreator专有格式文件拖动到附带工具scfadjust的图标上面,调整后的时间轴就会出现在同一个文件夹下。

这里有2点要注意的。1SubCreator设置中,要把时间信息设置成第一个选项(见时间轴入门)。2、在拖动文件的时候,务必记住选中2个文件后,鼠标拖动的是SubCreator的那个文件而不是Timecodes文件。虽然Windows平时复制文件等操作中选中2个文件拖动哪个效果是不一样的,但是这里不行。具体操作见图:

  拖动完毕以后,会生成一个调整过的SubCreator文件,文件名中含有“out”字样的。用SubCreator导出成SSA。记住,这个时候的时间轴已经对不上原来的视频了,但是对的上预先处理过的视频(就是前面从MKV里面解出来并调整FPSAVI或者用AviRead处理过的AVI)。用前面介绍过的办法把字幕嵌到预先处理过的AVI中。(注意,计算比特率的时候填写的影片时间不是原先的影片时间,而是预先处理过的AVI的时间,和原影片时间可能是不一样的)

  但是这样内嵌出来的AVI文件,虽然时间轴和图象对的上,但是图象和声音对不上,图象还是忽快忽慢的。现在就是要把这个AVI文件和Timecodes一起封装到MKV文件中,播放起来就一切正常了。

  这些做完以后,有3个文件是最后要用的。一个是最后内嵌好以后的视频,一个是前面解出来的Timecodes,还有一个是最早解出来的音频流。

启动MKVMerge GUI(就是封装MKV的那个工具),像原来那样加入视频、音频:

  然后选中图中蓝色部分的那个流(操作的时候可能位置和图中的不一样,总之是写有type:video[图中加黑的文字]的那一行)

选中以后,下方的一些选项变得可用。点击图中蓝色那个按钮,然后选择Timecodes文件

  选择好Timecodes文件以后,其他操作都是和平时封装MKV文件一样的,没有区别。

  封装好MKV以后,播放看看,肯定是字幕准、速度和片源一样稳的视频了。

(完)

本文来源:https://www.2haoxitong.net/k/doc/8c2c37156c175f0e7cd137a0.html

《雷鸣视频制作全教程- 8- 帧速率可变型片源的内嵌.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式