老婆借了盘DVD,非要让我把它想办法留下来。保存.vob是不现实了。 为了给老婆展示一下Linux的强大,特地到网上攻读了一番,现留此存照。 很可惜的是:工作的最开始还是用了一下Windows,因为我的机器都没有DVD-ROM, 所以用别人的机器把那些VOB文件copy下来,然后上传到我的Linux服务器上。这台机器上没有X Window, 所以下面全部的工作都是ssh到服务器上,然后在命令行下做的。 以下文字参考了下面列的几个网站: 1. http://www.bunkus.org/dvdripping4linux/en/separate/ 该教程也算是经典,Google时基本上是第一个。但有些老,有些mencoder的参数过时,或已经不能用了,例如:de-interlace。 2. http://www.mjmwired.net/resources/mplayer-fedora.sHtml 该教程是安装MPlayer(包括MEncoder)。主要针对Fedora3, 但其他distros也可以参考。象Gentoo, 我知道用上适当的USE flags,ACCEPT_KEYWordS="~x86" emerge mplayer 就可以了。 值得注意的就是要装上LAME(mp3的编码器),而且要先装LAME,再编译MPlayer。Gentoo可以USE="lame"。 3. http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html 最强大的资料末过man page了,当然我是没认真读了,只是需要的时候,到里面查了几次。crop和de-interlace的功夫就是从这里学的。 4. 再有就是MPlayer的user mailing-list. 实际上,你根本不用问,只要search就好了,你碰到的问题十有八九都被问过了。在这些mailing-list上问FAQ不太好。 话不多说,言归正传。
1. 音频编码: mencoder -ovc frameno -o frameno.avi -oac mp3lame -lameopts abr:br=96 -alang en VTS_01_1.VOB 稍微解释一下参数的意思: 一般字母o开头的参数就是指output的意思了, a就是audio, v是video, c是codec, br是bit-rate(br有几种:vbr, abr, cbr。v,a和c意思分别是variable,average和constant。) alang是指audio language。en是英文,中文是zh。有时可能会有两个声道,都是中文(zh),一个普通话,一个广东话。这时就不能用alang这个参数了,要用-aid。还有,就是这里用了LAME的mp3编码。 总之,这行命令中需要改的就是"en"和文件名了。"96"也可改成128,但最终的文件可能会比较大。 frameno和frameno.avi不要改。
2. 视频编码:(1st pass) mencoder -oac copy -o /dev/null -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=576:vhq:vpass=1 -vf scale=640:480,crop=640:344:0:66,lavcdeint VTS_01_1.VOB 这里用了libavcodec来做mpeg4的编码。最重要的就是-vf了,vf意思是video filter。所有的filters要用逗号隔开。我用了scale,crop和lavcdeint三个filters。scale就是把DVD原本的 720x576变成640x480。crop就是把已经scaled成640x480的图像继续切成640x344。0:66是告诉mencoder从什么地方开始切,从左上角开始算,横者数0,竖者数66。注意切出来的图像最好是8的整数,如上面的344。lavcdeint就是de-interlace,不知道中文怎么译。如果你弄出来图像上能看到明显的横纹,就要加上这个选项。
3. 视频编码:(2nd pass) mencoder -oac copy -o mymovie_1.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=576:vhq:vpass=2 -vf scale=640:480,crop=640:344:0:66,lavcdeint VTS_01_1.VOB 在first pass里我们已经看到,输出是到/dev/null的,也就是丢掉不要了。输出的只有divx2pass.log这么一个文件。到了这个second pass,就要在-o后面放上真正的文件名了。还有就是把vpass改成2。我用的vbitrate=576是为了控制2小时10分钟片子压到小于700MB。我记得音频部分做完时会有一个建议的vbitrate,可以参考。 好了,已经把第一个vob变成avi了。然后删掉divx2pass.log和frameno.avi,重复上面的步骤,把所有的vob都变成avi。
4. 把所有的avi文件用下面的命令处理一下: mencoder -idx mymovie_1.avi -ovc copy -oac copy -o mymovie_1_out.avi
5. 合并所有的avi成一个文件: cat mymoive_1_out.avi mymoive_2_out.avi ... mymoive_8_out.avi > mymovie.avi mencoder -noidx -ovc copy -oac copy -o mymovie_final.avi mymove.avi OK! 搞定! dvd我们一般把它rip成avi格式。用的编码一半是xvid.mpeg4,lavcopts 质量较好的编码一半选用3pass编码方式,得到的文件大小一般也是700M左右。就是说要编码三次。(可惜不能用rmvb,它就比avi小多了,质量也很好)。 第一次是音频编码,可以顺便剥离字幕,第二次是第一次视频编码,主要为了得到一个编码表; 第三次就是按照第二次得到的码表再次编码,顺便把第一次得到的音频合成进去。 简单的就如下: PHP代码: 3-pass编码的例子:dvd-rip rm frameno.avi -- 移去这个文件,它可能来自以前的3-pass编码(它会干扰当前编码) mencoder dvd://2 -ovc frameno -o frameno.avi -oac mp3lame -lameopts vbr=3 mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac copy -o movie.avi mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac copy -o movie.avi 几个解释补充:
1:音频加字幕: PHP代码: mencoder dvd://1 -vobsubout suBTitles -vobsuboutindex 0 -sid 2 -o frameno.avi -ovc frameno 注意 :这里的frameno.avi就是你得到的音频。我这里没有进行编码,就是说直接把dvd的音频流给剥离出来(其实就是ac3编码)。 如果如果你想用lame编码成mp3那么参考Fortraner的介绍。 -vobsuboutindex 0 -sid 2 这个参数就是为了从dvd文件里把字幕给剥离出来。前面的0就是说我们选的字幕(就是sid 2)做为我们最后得得到字幕文件的index 编号为0的字幕。(字幕包括以.idx和.sub结尾的一对文件。) sid 2 表示我们选的dvd字幕中的sid编号(language id)为2字幕。为什么选2呢?因为你用mplayer -vobsubid 2播放dvd时正好出来的是中文。如果你用-vobsubid 1得到的是中文那么你就用1。 关于字幕提取。详见mplayer的官方文档(有中文的)。 举个一次性在进行3-pass编码的同时从DVD复制两份字幕的例子: PHP代码: rm subtitles.idx subtitles.sub //这里是为了防止原先存在的字幕的干扰。 mencoder dvd://1 -vobsubout subtitles -vobsuboutindex 0 -sid 2 -o frameno.avi -ovc frameno mencoder dvd://1 -oac copy -ovc divx4 -pass 1 mencoder dvd://1 -oac copy -ovc divx4 -pass 2 -vobsubout subtitles -vobsuboutindex 1 -sid 5
2:视频编码: 视频编码的参数设置 Fortraner已经说的很详细了。 我对参数的设置就不知其所以然了。问题是如何用参数才能使编码质量达到比较高的水平。这里是有很多东西可以研究的。但我拼命看man,文档,实验了好多方法,感觉也和上面给出的简单的例子的编码质量差不多。-_- ! 大家试试Fortraner兄的参数。看看有没有大的改观。
3:还是讲讲怎么从dvd copy吧。 a:上面的例子是用来 dvd://? 的参数。这表示直接用dvd光驱。?表示的是我们从那个轨道开始编码。一般dvd有好几个轨道。第一个往往是片头和什么节目预告之类的。所以我一般直接从2开始。3也是。一般没什么用了。具体你可以看看光盘里的info文件。有几个。 b:那么像Fortraner兄说的没有光驱或已经把vod文件拷贝出来的怎么办? Fortraner兄的方法也是一个好办法。但不是最好的。太麻烦。 其实我们可以一次性的搞定: 先建立一个目录比如:DVD。然后把那些dvd光盘里的文件都扔到这个目录。注意,不要忘了把那些info文件也扔进去。那时dvd的轨道信息。有用。 然后我们就把这个DVD目录当成dvd光驱,方法就是: PHP代码: mencode dvd://2 -dvd-device DVD/ (这里指定你的DVD的路径) c:那么我要是不用上面的办法呢?就是说我就选几个vod文件。我能一次性给搞定呢?行。 请看例子: PHP代码: cat 1.vod 2.vod mencoder -noidx -ovc copy -oac copy -o output.avi - 注意不要忘了加“-”。在linux系统好像直接可以用mencode *.vob.我想不行的话你就用cat吧。cat好强啊。 最后我们可以用一个脚本来自动完成所有的步骤: 我的730M的3pass编码的脚本 PHP代码: #!/bin/sh rm -rf frameno.avi mencoder dvd:// -vobsubout subtitles -vobsuboutindex 0 -sid 0 -ovc frameno -o frameno.avi -oac mp3lame -lameopts vbr=3:abr=80 mencoder dvd:// -ovc lavc -lavcopts vcodec=mpeg4:vqh:vpass=1 -oac copy -o aa.avi mencoder dvd:// -ovc lavc -lavcopts vcodec=mpeg4:vqh:vpass=2 -oac copy -o aa.avi 不知道哪里还没有明白。大家主要还是看doc文档和man吧。很详细的。 哪位仁兄对编码参数比较精通的讲讲编码参数吧。 发现3-pass的方法有问题,音频/视频有些不同步。 查了下mailing-list,上面说2-pass就够了,试了下,果然把不同步的问题解决了。综合了yqh1203大侠的招数之后,现在发现就两步,全解决。hahaha。。。 事情本来就该这么简单! Step 1: mencoder dvd://1 -dvd-device ./ -oac copy -aid 128 -o /dev/null -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=576:vhq:vpass=1 -vf scale=640:480,crop=640:344:0:66,lavcdeint -vobsubout sub-en.txt -sid 1 这步是视频的pass-1。已经把原先的音频那步去掉了,多余! 顺便把字幕也抓出来了。 aid和sid可以用下面的命令查: mplayer dvd://1 -dvd-device ./ -v 然后找[open]开头的那几行。 Step 2: mencoder dvd://1 -dvd-device ./ -oac mp3lame -lameopts abr:br=96 -o moviename.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=576:vhq:vpass=2 -vf scale=640:480,crop=640:344:0:66,lavcdeint 注意在这步-oac后面已经加上音频编码! OK!全搞定!我上面说的第4,5步在用了-dvd-device之后都没用, 就当废话好了。
再多说两句废话: 1. “-dvd-device ./”是对我这种没DVD-ROM的人的。 如果你有,把它去掉就好了。 2. 音频br=96,视频vbitrate=576是为了把我的130分钟的片子控制在700MB以内用的。根据你自己的片长适当改吧。 3. crop这部分可能也要适当改下,没准我切掉的太多了。
[1] [2] 下一页
(出处:http://www.sheup.com)
上一页 [1] [2]