# [FFmpeg] 交錯/循序掃描 ## 交錯 (Interlaced) 交錯掃描的影片是由連續的圖場 (Field) 所構成,每一個圖場只有一半的畫面,兩圖個場才能組成一張畫格 (Frame)。 ### 圖場 (Field) 類型 頂場 (Top Field) 代表只有奇數行像素的圖場,底場 (Bottom Field) 代表只有偶數行像素的圖場。第一個圖場為頂場稱為頂場優先 (TFF, Top Field First),第一個圖場為底場稱為底場優先 (BFF, Bottom Field First)。 ### 在傳統 CRT 顯示器上的畫面更新方式 交錯 (Interlaced) 掃描 : 依序由上而下、由左而右將一個圖場的所有像素逐一顯示出來。 循序 (Progressive) 掃描: 依序由上而下、由左而右將一個畫格的所有像素逐一顯示出來。 ### 圖場速率與畫格速率 60i 代表每秒 60 圖場,換算成每秒畫格 (fps, Frames pre Sec) 值為 30 即 30p。NTSC 標準為 60i; PAL 標準為 50i,要注意 NTSC 60i 實際上為每 1.001 秒 60 圖場,換算成 fps 值為 30/1.001 (約 29.97) 即 30p。而通常所說的 1080i 為 [1920 or 1440x]1080/60i。 ### 數位攝影機拍攝的交錯式影像 由於交錯影像比循序影像少了一半的資料量,所以對於硬體的需求更低。但由於每個圖場所拍攝的時間點不同,例如第一個圖場是在 1/60 秒時被拍攝的,而第二個圖場則是在 2/60 秒時所拍攝的。將兩個圖場結合成一個完整的畫面,如果被拍攝的物體沒有任何移動,可以得到完美的畫面;否則,由於兩個圖場有相當程度的差異,也就是說若將圖場直接合成為畫格,動態畫面將會出現水平的梳狀線條。 ## 電影/電視的交錯式影像 ### TeleCine 膠轉磁 (TC ,TeleCine) 是將電影膠捲轉為為數位檔案或電子訊號之程序。PAL 或 SECAM 標準使用 3:2 Pulldown,NTSC 標準則使用 3:2 Pulldown 也稱為 2:3 Pulldown。 ### 2:2 Pulldown 2:2 Pulldown 是將 25 轉為 50i 的程序,將每1個畫格轉為2個圖場。 ### 3:2 Pulldown 3:2 Pulldown 是將 24p 轉為 60i 的程序,將第1個畫格轉為2個圖場,第2個畫格轉為2個圖場插入1個複製圖場,每2個畫格為1個循環,以此 2-3-2-3-2-3... 類推,例如: A、B、C、D... -> A1、A2、B1、B2、B1、C2、C1、D2、D1、D2...。若將 24/1.001 fps 經過 2:3 Pulldown 所得到的圖場速率就是 60i (60/1.001i)。你會發現第3個畫格是 B1+C2 而第4個畫格是 C1+D2,兩個圖場分別來自 24p 片源的不同畫格,也就是說若將圖場直接合成為畫格,動態畫面會出現水平的梳狀線條。 ### 圖場匹配 圖場匹配 (Field Match) 是通過將圖場重新分配組合的方式來將影片恢復無交錯的狀態。3:2 Pulldown 的影片做圖場匹配後所得到的影片每5個畫格中有1個重複的畫格。 ### ITVC IVTC (InVerse TeleCine) 是將 TC 還原的程序,先用圖場匹配消除交錯,再將產生重複的畫格刪除 (Decimate) 就可以得到原始的畫格速率。 ## Deinterlaceing 與 IVTC 若動態畫面每1個畫格都出現水平的梳狀線條則需要做反交錯 (Deinterlaceing)。 若動態畫面每5個畫格中有2個梳狀畫格則需要做 IVTC。 使用 YADIF 反交錯 (預設值): ```powershell ffmpeg -i input.mov -vf yadif -c:v libx264 -crf 18 output.mp4 ``` 如果需要更高的輸出品質可以改用 BWDIF 或 NNEDI。 [速度] YADIF <-> BWDIF <-> NNEDI [品質] > 註:NNEDI 需要二進位檔案 [nnedi3_weights.bin](https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin),將它放到工作目錄下即可。 由於 YADIF/BWDIF/NNEDI 預設值會將每個圖場輸出為一張畫格,例如輸入為 NTSC 60i (60/1.001i) 會得到 60p (60/1.001 fps) 輸出。如果要得到 30p (30/1.001 fps) 輸出,可以使用以下參數設定。 使用 YADIF 反交錯,兩個圖場輸出為一個畫格: ```powershell -vf "yadif='mode=0'" ``` 使用 BWDIF 反交錯,兩個圖場輸出為一個畫格: ```powershell -vf "bwdif='mode=0'" ``` 使用 NNEDI 反交錯,只使用其中一個圖場: ```powershell -vf "nnedi='field=a'" ``` ### Filter Chain 如果要使用多個 filters 必須注意先後順序,例如反交錯必須要在縮放之前。 通常的 Filter Chain: deinterlace, deblocking, crop, scale, sharpen, denoise 例如 1080i 裁黑邊並縮放到 HD: ```powershell -vf "bwdif,crop=1920:800:0:140,scale=1280:536,nlmeans" ``` IVTC (InVerse TeleCine) 在 FFmpeg 之中可以使用 pullup filter 與 fps filter 或 -r 選項來做 ITVC。 例如使用 pullup filter 對 NTSC 60i 做 IVTC: ```powershell -vf pullup -r 24000/1001 ``` 或是: ```powershell -vf "pullup,fps=24000/1001" ``` 或者是使用圖場匹配 (fieldmatch)、刪除重複畫格 (decimate) 的 filter 來做 ITVC。 使用 fieldmatch+decimate filter 對 NTSC 60i 做 IVTC: ```powershell -vf "fieldmatch,decimate" ``` 如果片源混合 TeleCine 與原生交錯,則 fieldmatch 將無法匹配圖場於交錯部分,但是這些剩餘的梳狀畫格將被標記為交錯,可以在刪除重複畫格之前使用反交錯 filter (例如 yadif) 來處理這些畫格。 例如: ```powershell -vf "fieldmatch,bwdif='mode=0:deint=1',decimate" ``` 由於 decimate filter 目前僅適用於恆定畫格速率 (CRF, Constant Frame Rate) 輸入,如果輸入混合了不同的 fps 就必須使用 fps filter 將輸入轉為恆定畫格速率,例如 TeleCine 30 fps 與循序掃描 24 fps。 例如 60i(30 fps)/24 fps 混合影片做 IVTC: ```powershell -vf "fps=30000/1001,fieldmatch,decimate" ``` 下列 filter chain 可以適用於大部分情況下: ```powershell -vf "fps=30000/1001,fieldmatch,bwdif='deint=1',decimate" ``` ## 輸出交錯掃描影像 交錯式掃描對於畫質有負面影響,且現代影片播放器都支援循序轉交錯掃描輸出,若非特殊需求則不需要將循序掃描的影片轉為交錯掃描。 若要將循序掃描的影片轉為交錯掃描可以使用 ilme 旗標 TFF: ```powershell -flags +ilme+ildct -top 1 ``` BFF: ```powershell -flags +ilme+ildct -top 0 ``` NTSC 60i TFT: ```powershell -vsync cfr -r 30000/1001 -flags +ilme+ildct -top 1 ``` NTSC 60i TFF (24P with 3:2 pulldown): ```powershell -vf "fps='24000/1001',telecine='first_field=top:pattern=23'" ``` PAL 50i BFF: ```powershell -vsync cfr -r 25 -flags +ilme+ildct -top 0 ``` ###### tags: `ffmpeg`