---
# System prepended metadata

title: '[FFmpeg] 交錯/循序掃描'
tags: [ffmpeg]

---

# [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`