# [FFmpeg] DVD Video 編碼
## 簡介
使用 FFmpeg 編碼輸出標準 DVD-Video 教學,此文僅供參考與學習 FFmpeg 用法。
實際製作標準 DVD 視訊影片推薦使用以下軟體:
- TMPGEnc Authoring Works (付費,高自訂性、多樣式)
- VSO DVD Converter (付費,高易用性)
- DVDStyler (免費)
由於 DVD Video 是很老舊的標準了,如果你有藍光播放機,只是需要將影片燒錄到 DVD 上,建議可以考慮 AVCHD 格式,同一張 DVD 光碟片可以燒錄畫質更高的 720p AVCHD 格式影片。
## DVD Video NTSC 標準
| 名稱 | 畫面規格 | 掃瞄方式 |
| ----------------- | -------------------------------- | ----------- |
| Full D1 NTSC 16:9 | 720x480 [PAR 40:33, DAR 20:11] | 60i/30p |
| Full D1 NTSC 4:3 | 720x480 [PAR 10:11, DAR 45:33] | 60i/30p |
| Full D1 PAL 16:9 | 720x576 [PAR 16:11, DAR 20:11] | 50i/25p |
| Full D1 PAL 4:3 | 720x576 [PAR 12:11, DAR 45:33] | 50i/25p |
| D1 NTSC 16:9 | 704x480 [PAR 40:33, DAR 16:9] | 60i/30p |
| D1 NTSC 4:3 | 704x480 [PAR 10:11, DAR 4:3] | 60i/30p |
| D1 PAL 16:9 | 704x576 [PAR 16:11, DAR 16:9] | 50i/25p |
| D1 PAL 4:3 | 704x576 [PAR 12:11, DAR 4:3] | 50i/25p |
NTSC 60i = 60000/1001i = 30000/1001 fps
NTSC 24p = 24000/1001 fps
PAL 50i = 25fps
PAL 25p = 25fps
> 註:DisplayAspectRatio = Width / Height * PixelAspectRatio
### 影音編碼
**DVD Video**
編碼格式: H.262/MPEG-2 Part 2
顏色取樣格式: YUV 4:2:0
量化: 8bit
色階/動態範圍: 16-235
**DVD Audio**
- Linear PCM: 1-2 channels, 1.5 Mbit/s (2 channels)
- Dolby Digital (AC-3): 1-5.1 channels, 64 to 640 kbit/s
為了分配更多儲存空間給視訊使用
建議使用壓縮率較高的 AC-3 音訊編碼格式
## FFmpeg 參數設定
以下皆應用 Letterbox (填充黑邊) 維持顯示比例不失真
### 畫面設定
Letterbox (填充黑邊) 維持顯示比例不失真
- 720x480, PAR 40:33 (DAR 20:11) - Full D1 NTSC 16:9:
```powershell
-filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((720*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'"
```
- 720x480, PAR 10:11 (DAR 45:33) - Full D1 NTSC 4:3:
```powershell
-filter:v "scale='w=min(720,trunc((480*11/10*dar)/2+0.5)*2):h=min(480,trunc((720*10/11/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'"
```
- 704x480, PAR 40:33 (DAR 16:9) - D1 NTSC 16:9:
```powershell
-filter:v "scale='w=min(704,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=704:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'"
```
- 704x480, PAR 10:11 (DAR 4:3) - D1 NTSC 4:3:
```powershell
-filter:v "scale='w=min(704,trunc((480*11/10*dar)/2+0.5)*2):h=min(480,trunc((704*10/11/dar)/2+0.5)*2)',pad='w=704:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'"
```
### 畫格速率
- NTSC 30p:
```powershell
-vsync cfr -r 30000/1001
```
- NTSC 60i (24p with 3:2 Pulldown):
```powershell
-filter:v "fps='24000/1001',telecine='first_field=top:pattern=23'"
```
- NTSC 60i:
```powershell
-vsync cfr -r 30000/1001 -flags +ilme+ildct -top 1
```
- PAL 25p:
```powershell
-vsync cfr -r 25
```
- PAL 50i:
```powershell
-vsync cfr -r 25 -flags +ilme+ildct -top 0
```
> 注意:無法使用兩個 `-filter:v` 選項,必須合併為一個。
### 視訊編碼設定
NTSC DVD 相容視訊 - MPEG-2 6000kbps:
```powershell
-c:v mpeg2video -pix_fmt yuv420p -g:v 18 -b:v 6000k -maxrate:v 8000k -minrate:v 0 -bufsize:v 1835008
```
對於 PAL DVD: -g 選項 (GOP Size) 設定值為 15
### 音訊編碼設定
DVD 相容音訊 - 立體聲 AC3 192kbps:
```powershell
-c:a ac3 -ac 2 -b:a 192k -ar 48k
```
### 檔案格式
DVD 相容檔案:
```powershell
-packetsize 2048 -f mpegts
```
## 實際轉換檔案
D1 NTSC DVD: 704x480p [PAR 40:33 DAR 16:9], 29.97 (30000/1001) fps
Step 1. 音訊編碼:
```powershell
ffmpeg -i input.mkv -vn -async 1 -ar 48k -c:a ac3 -ac 2 -b:a 160k -f ac3 dvdaud.ac3
```
Step 2. 第一階段視訊編碼:
```powershell
ffmpeg -i input.mkv -an -pass 1 -vf "scale='w=min(704,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=704:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'" -vsync cfr -r 30000/1001 -c:v mpeg2video -pix_fmt yuv420p -g:v 18 -b:v 6000k -maxrate:v 8000k -minrate:v 0 -bufsize:v 1835008 -f null -
```
Step 3. 第二階段視訊編碼:
```powershell
ffmpeg -i input.mkv -an -pass 2 -vf "scale='w=min(704,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=704:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='sar=40/33'" -vsync cfr -r 30000/1001 -c:v mpeg2video -pix_fmt yuv420p -g:v 18 -b:v 6000k -maxrate:v 8000k -minrate:v 0 -bufsize:v 1835008 -f mpegts dvdvid.mpg
```
Step 4. 合成視訊與音訊檔為單一檔案:
```powershell
ffmpeg -i dvdvid.mpg -i dvdaud.ac3 -c copy -packetsize 2048 -f mpegts dvd.mpg
```
Step 5. 使用 DVD Muxer (例如 TMPGEnc DVD Author) 封裝輸出 DVD 目錄或 ISO 檔:
這邊以 dvdauthor 為例:
```powershell
dvdauthor --title -o 輸出目錄名稱 -f dvd.mpg
```
Step 6. 使用支援 DVD 視訊光碟輸出的燒綠軟體 (例如 CDBurnerXP) 燒綠 VIDEO_TS 目錄
DVD目錄結構: 根目錄\VIDEO_TS\...
## 檔案大小預估
光碟容量 (位元組):
- DVD-R SL: 4,707,319,808 bytes
- DVD+R SL: 4,700,372,992 bytes
- DVD-R DL: 8,543,666,176 bytes
- DVD+R DL: 8,547,991,552 bytes
由於必須精準控制輸出大小,所以 Bitrate 控制模式用 2 pass
例如: 來源 90 分鐘 (5400 秒) 轉 AVCHD 燒錄在 DVD-R
光碟容量換算成位元
4,700,372,992 bytes = ( 4,700,372,992 * 8 ) bits = 37,602,983,936 bits
假設音訊 Bitrate 設為 640 Kbps 則音訊檔案大小為
AudioSize = 640 Kbps * 5,400 sec = 640000 bits/sec * 5,400 sec
= 3456,000,000 bits
預留 10 MB (83,886,080 bits) 則視訊可用容量為
VideoSize = 37,602,983,936 - 3456,000,000 - 83,886,080 = 34,063,097,856 bits
則視訊可用 Bitrate 為
VideoBitrate = 34,063,097,856 bits / 5,400 sec ~= 6307981 bps ~= 6307 Kbps
視訊 Bitrate 必須小於或等於 6307 Kbps
###### tags: `ffmpeg`