老婆借了盤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這部分可能也要適當改下,沒准我切掉的太多了。