使用AviSynth做DVDrip

出自 NMM Doc
於 2010年8月13日 (五) 22:56 由 Lititude (對話 | 貢獻) 所做的修訂 (使用TIVTC做IVTC)
前往: 導覽搜尋

圍繞AviSynth等工具做DVDrip,視頻部分處理大致可以分為以下幾步

  • 判斷類型,IVTC或反交錯
  • 保持正確的SAR
  • 編碼及封裝


準備工作

Telecine概念

IVTC(InVerse TeleCine,反膠捲過帶)是DVDRip中的一個基本概念。

為了將電影(24fps)轉換到NTSC電視(30fps)上能夠正常播放的格式,需要作Telecine(膠捲過帶)。其做法是先把電影的一幀拆成兩個場,擁有第0條掃描線的場叫top field(頂場),也叫odd field(奇數場),擁有第1條掃描線的場叫bottom field(底場),也叫even field(偶數場)。0t和0b兩個場可以組成完整的第0幀。

取出前4幀看,拆成了8個場,重新組合(這裡用top field first,tff):

0t 1t 1t 2t 3t
0b 1b 2b 3b 3b
A B C D E

這樣8個場又以這種方式組成了5幀。24幀中每4幀都如此組合,24 * 5 / 4 = 30,就成了30fps的影片。因為原來的顯像管電視本來就是交錯顯示的,這種方式看起來並不會有問題但是電腦顯示器或液晶電視是逐行掃描的,其中的C和D幀由於是由兩個來自不同幀的場組成的,因此看起來可能就有交錯,有人稱為梳狀波紋。

以上這個過程叫做3:2 pulldhwon。做過3:2 pulldown的電影就變成30fps的了,在NTSC的電視上播放就沒有同步問題了,NTSC的DVD也用此種方式的視頻。但是在電腦上播放每5張畫面會有2張有交錯,有人稱之為「5爛2」。這種DVD處理起來最簡單。

30fps的影片就不必做3:2 pulldown了,因為本來就是30fps的。

電影要在pal的電視上播放,需要做2:2 pulldown。不過沒有NTSC那樣的複雜組合,只是將播放速度加快5%,既把24fps的畫面以25fps播放,聲音也加快5%,保持同步。

把3:2 pulldown後的30fps通過重新組合場,刪掉重複的幀,還原成原本的24fps的過程叫做IVTC廣義上的IVTC包括了處理混合類型的DVD,還原成正常幀率的過程。

DVD的類型

要正確的IVTC,首先要明白動畫DVD的類型

  1. Film
    3:2 pulldown的類型。
    有些DVD encoder在壓制前會先做IVTC,再做壓縮,這樣做的好處是每5幀可以省掉1幀,而且可以對純淨的幀進行編碼,幀的壓縮率比場要高。但是如何在NTSC電視上播放呢?編碼器會寫入pulldown flag,解碼器在播放時按照pulldown flag播放畫面,就能在NTSC電視上同步了。
    絕大多數電影都是在完成剪輯後再去telecine,然後以這種方式編碼的,處理起來非常簡單。在DGIndex里Force film,就會輸出24fps無交錯的。DGIndex報告95%film以上的類型用Force Film處理。
    也有剪輯的亂七八糟的pulldown的片子,在壓DVD時不做IVTC。這種片子也會在IVTC之後也會還原成24fps,但是不能在DGIndex里用Force Film,要用honor pulldown flag。IVTC的工作交給IVTC濾鏡處理。
  2. NTSC Video
    本身就是30fps的片子,在DVD里也存為30fps。這種片子不能做IVTC,不然每5幀就會少1幀,動態就不連貫了。
    DGIndex里報告95%Video以上的片子就是這種片子,前提是源是逐行掃描的。30i的隔行掃描需要做Deinterlace。
  3. Hybrid
    混合了film和和video的DVD。有很多具體的情況。
    • 30p是30p,pulldown的是pulldown的,互不影響。比如OP/ED是30p,正片是pulldown。
    • 30p和pulldown內容交叉溶解。
    • 30i滾動字幕覆蓋在pulldown的畫面上。
    • 淡入淡出處是30i的。
    • 前景是pulldown的,背景是30p的。
    • 先telecine再拉伸的。
    • 畫中畫的pattern或類型不一樣的。
    • 剪輯時少掉一個場,造成scene cut處無法匹配。


常見的IVTC工藝

  • 場匹配 Field Match
    把場和之前之後的場組合,還原出無交錯的幀。
  • 反交錯 Deinterlace
    這裡是狹義的反交錯,把場補成幀,但保持幀率不變。
  • Bob
    由於Interlaced視頻每個場是在不同的時間拍攝的,比如NTSC DV拍攝的視頻每秒拍攝60個場,相當於30fps。為了保持動態,把每個場都補成幀,就形成了60fps。二倍幀率並補全每個場的過程叫Bob。
  • Decimate
    刪除場匹配後重複的幀,還原原本的幀率。

一部片裡可能會遇到各種情況,比如有些地方是pulldown的,能做成24p,有些地方必須bob到60fps,因此只用一種幀率,即cfr就無法兼顧,這時候就必須把片子作成vfr的。mkvmp4都支持vfr。

準備工具

  • VirtualCloneCD或Deamon等虛擬光驅工具和DVDDecrypt
    用於抽出一話一話的vob和其他工作,比如也可以抽章節文件。
  • DGIndex
    存d2v,包含視頻解碼器,分離音頻
  • AviSynth及其插件、IDE(avsp)和文本編輯器
    IVTC等工作
  • x264
    視頻編碼器
  • 音頻壓縮工具
  • mkvtoolnix或mp4box
    封裝工具


DVDrip中視頻處理部分

用DVD Decrypt按照不同話數抽出

用虛擬光驅載入DVDISO,打開DVDDecrypt,用ifo模式,找到合適的章節,注意要選擇完整的一話。靠什麼判斷選擇了完整的一話呢?注意下面的時間,再說,抽出來試試不就知道了。

圖-DVDdecrypt截圖,標註光驅、目標目錄、選擇章節。

如果沒有設置過切割選項,DVDDecrypt則默認按照1GB分割文件。不過沒有什麼影響,DGIndex可以打開多個文件。

DVDDecrypt還可以抽出章節文件,但這個不准,必須調整。

圖-DVDDecrypt設置截圖,不分割文件

圖-DVDDecrypt設置截圖,抽出章節文件

用DGIndex保存d2v

用DGIndex打開抽出來的vob,按F4(或file->play)後DGIndex開始播放片子,並且會出現一個信息窗口。我們需要藉助信息窗口返回的信息初步判斷片子的類型。

我們看到Video Type是film,那麼這個片子是film類型的,我們可以直接選擇force film,這樣在avs里載入d2v會得到24fps的正確幀率的視頻。因此說film類型的DVD最簡單。除了film類型,DGIndex還會返回另一種類型:Video。

Frame Struct是Frame,表示此幀是按照Frame編碼的。還有按照Field編碼的。

Frame Type是Progressive,只是反應MPEG2碼流中的progressive_frame旗標,和片源到底是隔行掃描/逐行掃描沒有關係。把逐行掃描當作隔行掃描和把隔行掃描當作逐行掃描壓制的有不少。

我們可以試試在菜單的Video->Field Operation里選擇Honor Pulldown Flags,保存一個d2v。DGIndex會讀取整個流的數據,生成d2v文件,同時還會分離出音頻。等保存完畢,再看信息框:

圖->保存完畢時的信息框。

可以看到100%Film,這下就可以放心大膽的Force Film了,但其實靠剛才的預覽就可以放心force film。當Film不足95%時,選擇Honor Pulldown Flags模式。注意千萬不要選錯,把不能Force Film的給Force Film了,是得不到正確結果的。

在Video菜單里,還有別的會影響解碼的選項。在Avs里載入d2v,DGDecodec會直接把解碼後的YV12傳遞過來,這裡設置的PC/TV Scale是不影響的。Crop是會影響avs里的畫面的。這裡的Crop濾鏡在高度上必須切4的倍數,在寬度上可以切2的倍數,原因請複習YV12色彩空間

IVTC操作

得到了d2v,我們就可以用avs了。先把DGIndex文件夾里的DGDecodec.dll放到avs的語法:插件插件自動加載目錄里。打開avsp,把d2v拖進去,avsp會自動生成一行

MPEG2Source("Direction\DVDvob.d2v")

如果有其他選項,就去掉;如果你想知道具體有哪些選項,這些選項是什麼意思,就看DGDecode的Manual吧。

MPEG2Source是源濾鏡,負責解碼並載入vob中的視頻流。

此時會得到一個720x480的視頻。假如剛才是Force Film後存的d2v,這一步就不要看了,直接看選擇正確的分辨率。如果沒有Force Film,就利用AviSynth以及他的插件和腳本做IVTC。

常用的IVTC和反交錯插件有:

還有一些IVTC和反交錯腳本:

如果下面冒出來了新的插件,也不要驚訝


使用TIVTC做IVTC

TIVTC是tritical大神寫的一套IVTC濾鏡,包括

  • tfm - 場匹配濾鏡,先用多種方式組合附近的場,以匹配成完整的幀,即沒有交錯的幀。如果實在沒有辦法匹配出完整的無交錯的幀,就把該幀反交錯(DeInterlace)掉。
  • tdecimate - 刪掉重複的多餘幀的濾鏡,可以用2pass實現vfr。
  • Mergehints、RequestLinear、FrameDiff、FieldDiff和ShowCombedTIVTC - 眾多輔助濾鏡。
  • IsCombedTIVTC、CFieldDiff和CFrameDiff - 條件函數,用來給ConditionFilter當判定標準的函數。

一般只用到tfm和tdecimate。

[[[TIVTC|TIVTC的manual給出了9個例子]],都非常簡單易用,基本概括了各種情況。


事實上,TIVTC自動處理情況複雜的動畫還是遠遠不夠的。動畫中的漸變,包括淡入淡出和場景之間的交叉溶解在內的漸變,有非常大的隔行掃描頻率。也就是說漸變場景處是沒有完整幀的,無法匹配出原本逐行掃描的幀。但是在這種地方,tfm是相當無力的,經常發生檢測不出來的情況,把這些幀當作匹配成功而錯誤地放走。

好在tfm提供了一種更靈活的方法,用一個稱為ovr的文本文件強制某一幀用某個pattern匹配,或者強制其反交錯行為。見TIVTC/ovr

使用AAD做IVTC操作

AAD()

選擇正確的分辨率

之前曾提到,DVD大多數是可變高寬比的,產生可變高寬比是因為現實的攝像機一般會拍攝寬屏的,16:9或2.35:1的畫面,但是NTSC的DVD分辨率是720x480,PAL的DVD分辨率720x576,並不是4:3或16:9,因此在DVD的MPEG2碼流中會標明DAR,播放時按照這個標記將畫面拉伸至該比例,而且2.35:1的影片會在畫面上加黑邊,以保證比例正確。加黑邊稱為letterbox,拉伸至16:9稱為Anamorphic。

我們的目的是最終得到畫面比例正確的視頻,特別指解碼後顯示出來的SAR為視頻,而且不留黑邊。一般來說有兩種做法,一是在壓制前把SAR調整到1:1,二是在壓制時給碼流定義SAR,播放時就能得到不變形的畫面,兩種方法都要裁掉黑邊。

公式: 目標分辨率 = 當前分辨率 x SAR 原則:黑邊切乾淨,變形儘可能小,mod2,但是為了遷就傳統,大多數時候考慮mod8。不要怕切掉畫面,準備切掉的這部分畫面本來就是在電視上會被切掉的部分,這些邊緣的畫面是為了保險起見設置的OverScan。


觀察DGIndex信息框的提示,一般有以下幾種DVD。

  1. NTSC 4:3,分辨率720x480,SAR=10:11
    1. 左右各切8像素,得到704x480,再縮放至640x480
      AviSynth中: LanczosResize(640, 480, 8, 0, -8, 0)
      640/480 = 704/480 x 10/11
      由於縮放到640x480比不縮放利用碼流SAR的分辨小,可以省碼率,一般沒有人用10:11的SAR做DVDrip。
  2. NTSC 16:9,分辨率720x480,SAR=40:33
    1. 左右切7像素,再縮放至864x480
      LanczosResize(864, 480, 4, 0, -3, 0)
      864/480 = 713/480 x 40/33 x 0.99971954
      誤差在3%%左右,非常小。
      若發現黑邊比較大,總共切7不夠,就多切一點。切到706,在縮放到856x480
      LancozsResize(856, 480, 7, 0, -7, 0)
      856/480 = 706/480 x 40/33 x 1.000283286
      誤差也很小。
    2. 利用H.264的SAR
      首先把黑邊切乾淨,不要在AviSynth里縮放,用x264時加一個選項:--sar 40:33。一定要在x264里加這個參數,不然即使在容器里設置了DAR,播放器可能還是會無視掉容器的DAR,但是視頻碼流的SAR是不會被解碼器/播放器忽視的,在播放時會自動按照視頻碼流的SAR拉伸。
  3. PAL 4:3,分辨率720x576,SAR
  4. PAL 16:9

可以使用avsp的Resize Calculator輔助計算切多少邊、縮放到多少、比例誤差是多少。

不要改變色彩

從MPEG2Source會輸出YV12的視頻,在AviSynth里也是全程YV12處理。不要在AviSynth里動色彩。

YC伸張

可能你已經注意到了在DGIndex里的選擇TV Scale和PC Scale,色彩是不同的。選擇PC Scale時色彩很飽滿,很鮮艷,選擇TV Scale時顯得比較「灰」。這涉及到YUV範圍的問題。在電腦上亮度Luma的範圍是0~255,色度Chroma的範圍也是0~255,但是在TV上為了一些冗餘,亮度Luma範圍是16~235,色度Chroma的範圍是20~240。電視將TV Scale範圍內的色彩轉換為RGB,範圍外的就丟掉了。電腦上則相反,從0到255都用上了。DVD原本是在電視上播放的,因此編碼時也用TV Scale,這就導致在電腦上播放時本應該是黑色的地方卻是灰色的。很多人將這種情況稱為「黑位不准」,其實是不明白這中間的原因。現在的播放器大多數都會自動將TV Scale的轉換到PC Scale,因此在DVDrip時不要動「level」,將轉換工作交給播放時的軟件做。

但是播放時會不會做轉換很複雜,不同的播放器、解碼器、渲染器、顯卡以及顯卡驅動表現出的行為均不太一樣,可以參考這篇研究:

YUV<->RGB轉換係數

我們用到的顯示設備是用RGB色彩空間的,但是MPEG視頻里是用YUV色彩空間的,這就涉及到RGB和YUV互相轉換的問題。 除了上面的YV伸張,還有轉換矩陣(轉換係數)。ITU推薦了兩種轉換係數:ITU-R BT.601和ITU-R BT.709。前者ITU-R BT.601主要用在DVD等標清的視頻中,ITU-R BT.709主要用在HDTV、BluRay等高清的視頻中。

我們在DGIndex裡面已經見過轉換係數了,在DGIndex信息欄的Colorimetry一欄,其中BT.470-2 B,G*表示MPEG2中並沒有指定轉換矩陣,DGIndex按照標清級別的分辨率推測位BT.470-2。其實BT.470-2和ITU-R BT.601是一樣的,因此這個DVD就是用ITU-R BT.601。

實際上,現在的播放器、解碼器、渲染器也是按照分辨率選擇變換矩陣的。標清的(720p以下)就用ITU-R BT.601,高清(720p及以上)則用ITU-R BT.709。因此,在做DVDrip的過程中不能改變色彩變換矩陣

更進一步,在做SD<-->HD的縮放時,必須改變YUV的值,讓渲染器用分辨率對應的變換時,能夠播放出色彩正確的畫面。用AviSynth的ColorMatrix插件。

SD->HD

ColorMatrix(clip, "BT.601->BT.709")

HD->SD

ColorMatrix(clip, "BT.709->BT.601")

如果在SD範圍內縮放,像在分辨率一節所講的例子,不要改變色彩變換矩陣

接下來可以降噪、銳化,讓畫面看起來更舒服,看個人喜好了。

總結視頻處理過程,有以下幾步:

判斷類型 -> IVTC -> 改變分辨率 [-> 降噪等處理]

如果選擇輸出SAR=1:1的畫面,那麼縮放一定要在ITVC之後做

之後就可以交給x264壓制了。

音頻處理

從DGIndex里抽出了音頻,一般是AC3、LPCM(wav)等。AC3可以直接封裝,LPCM最好壓一下

其他DVDrip方案

Direct264

用mencoder做DVDrip

Category:DVDrip Category:視頻編碼器