將具有非標準縱橫比的影片文件刻錄到 DVD
將影片文件刻錄到 DVD 的標準 Unixy 命令行方法如下(假設)
# 1. First use ffmpeg to convert to an mpg file. ffmpeg -i input.m4v -target ntsc-dvd output.mpg # 2. now do the authoring dvdauthor --title -o dvd -f output.mpg dvdauthor -o dvd -T
注意:
--title
設置 DVD 的標題,-T
設置目錄。在上述兩個命令中,-o 開關引用的是一個目錄,而不是實際的 dvd。# 3. roll the .mpg file into an ISO file genisoimage -dvd-video -o dvdimage.iso dvd
最後,將生成的 iso 文件刻錄到 DVD 空白。我使用的是可靠的 Brasero。
但是,此方法不適用於非標準縱橫比。DVD 格式在指定可接受的縱橫比方面非常嚴格。如果 dvdauthor 說類似的話,你就會知道你是否有這個問題
WARN: unknown mpeg2 aspect ratio 1
修改此方法以處理非標準縱橫比的好方法是什麼?
更新:感謝 Anthony 給出了非常徹底和明確的答案。我希望這對試圖為這個令人煩惱的問題找到答案的人有用。我不知道網上對此有任何其他明確的解釋。
基本方法是為您的影片添加黑色邊框,使其符合 DVD 允許的寬高比之一。
TLDR:跳到結論。
幾個定義
不過,首先,我需要定義幾個不同的東西:
- 縱橫比只是某物的寬度除以高度,通常表示為分數。傳統的斜線經常被冒號代替:我們寫 4:3 而不是4 ⁄ 3。有時,這些以十進製表示(1.333…)。您也可以將其稱為 8:6、12:9、16:12 等,因為它們都是相等的。甚至是 1.333:1(如果你能寫出足夠多的 3s 就等於)。
- 顯示縱橫比(DAR) 是實際顯示器(例如電視)的縱橫比***。***常見的顯示器通常是 4:3 或 16:9。
- 儲存縱橫比(SAR) 是儲存的圖像或影片的寬高比(以像素為單位)。例如,NTSC DVD 影片的最大解析度為 720 x 480(“Full D1”),其 SAR 為 1.5:1。
- 像素縱橫比是儲存圖像中單個像素的縱橫比。在影片中,像素並不總是正方形的。當非正方形時,它們通常比它們的高度更窄。
以上三者之間有一個簡單的數學關係:SAR × PAR = DAR。例如,720:480 * 8:9 = 4:3。那就是以全解析度放在 DVD 上的 4:3 顯示器的影片。
另一個複雜性
模擬電視沒有像素。相反,它有一個不斷變化的信號。該信號的某個部分應該被投射到顯示器的每一行上,然後有一個非活動時間以允許例如移動到下一行。不過,不同的電視顯示的每條線路的數量會略有不同,並且在電視的整個生命週期內甚至在電視預熱時也會有所不同。
DVD 說不要使用最左邊和最右邊的 8 個像素。所以在 720 個中,應該使用 704 個。每邊的 8 個像素應該用黑色填充。指定的 PAR 是這個 10:11。
當然,習慣了數字設備的人會覺得這很愚蠢(使用適合禮貌公司的詞)。許多商業 DVD 版本實際上都使用了全部 720 像素,有些預計 PAR 為 10:11,有些預計為 8:9。
$$ Or similar for a 16:9 DAR $$. 大多數硬體 DVD 播放器使用 10:11,當然它也取決於電視設置。 概括
如果您從希望顯示每個像素的影片開始,您可能希望將其調整為 704x480 (SAR 22:15),並帶有 8 像素的黑條。如果被切掉的邊沒問題,那麼您可以使用完整的 720x480。無論哪種方式,您都需要根據需要縮放影片以獲得 10:11(DAR 為 4:3)或 40:33(DAR 為 16:9)的 PAR,如果小於完整的 720x480 幀,則添加黑色酒吧。
其實在做
謝天謝地,
ffmpeg
可以做到這一點。在非官方的 ffmpeg 支持論壇上,ks_kalvan 提供了一個 ffmpeg 影片過濾器鏈,用於針對 16:9 DAR:-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='r=40/33'"
這是如何運作的‽
請注意,其中有三個過濾器:
scale
、pad
和setsar
。我們將依次從最後開始,因為最後的最簡單。最後一個過濾器令人困惑,直到您檢查文件(`man ffmpeg-filter)並找到這條髒話刪除的行:““setsar”過濾器設置過濾器輸出影片的樣本(又名像素)縱橫比。” 所以這實際上是將 PAR 設置為 40:33,這是我們在上面所說的想要使用的值。
過濾器
pad
添加黑色邊框。文件告訴我們ow是輸出寬度(即 720,來自w=720
零件),oh是輸出高度(即,480,來自h=480
零件)。iw和ih分別是輸入的寬度和高度。ow - iw因此是我們添加到寬度的像素數(類似地*,oh* - ih是高度);除以 2 將一半放在圖片的每一側。換句話說,我們將圖片居中。過濾器
scale
調整影片大小。選項指定新的w=
/輸出寬度,h=
選項指定高度。同樣,它是一個表達式,但更複雜。寬度和高度公式相同,只是高度和寬度交換了。讓我們檢查一下寬度 (w=
) 公式:
- 函式和運算符記錄在
man ffmpeg-util
. 對於正數,trunc(x+0.5)
獲得四捨五入到最接近整數的技巧是 ffmpeg 所沒有的。- 在這個
trunc(x+0.5)
技巧的基礎上,我們有trunc(x/2+0.5)*2
. x/2 給了我們一半 x,當然;截斷然後將其四捨五入到最接近的整數。將它加倍然後給我們最接近的偶數。- 我將使用«W»,其中實際命令使用 720。這是以像素為單位的最終輸出寬度。同樣,用 «H» 代替 480(最終輸出高度)。而不是 40/33,«PAR»,因為那是目標像素縱橫比。PAR -1 是PAR的倒數,即33/40。
dar
是一個 ffmpeg 變數。它是輸入影片的 DAR。- 理解這一點的關鍵是中間的計算,我們有一個計算是«H» × dar ÷ «PAR»。請記住,dar 是原始影片的顯示 w/h。因此,將目標寬度(以像素為單位)乘以 dar 可以得出如果我們將影片縮放為具有目標高度 «H» 和方形像素的寬度。除以 PAR 然後將其轉換為我們實際使用的非方形像素的寬度。
min(«W», # take the minimum [lesser of] target width and... trunc( # the truncation of (round to integer towards 0) («H»*«PAR⁻¹»*dar) # calculate the wanted output width, see note above / 2 + 0.5) * 2 # and get the nearest even number to that ))
範例:假設您拍攝 1280 x 720 像素的影片,顯示寬高比為 16:9。從中間開始:
- «H»«PAR⁻¹»dar = 48033/4016/9 = 704。
- 704 / 2 = 352.
- 截斷 (352 + 0.5) = 352
- 352 * 2 = 704
- 分鐘(720, 704)= 704
這是完整的可用寬度(即不包括 8 像素的不可用區域),正如我們在 16:9 顯示器上的 16:9 影片所期望的那樣。
當我們在高度上執行此操作時,我們得到 490,這要歸功於 min() 保持為 480。但實際上,這表明我們可能希望在此處使用 704(可用寬度)而不是 720,這正是480. 所以看起來那裡有一個小錯誤,導致微小(並且可能難以察覺)的失真。我相信這是固定的。
綜上所述
ffmpeg -i YOUR-FILE-HERE \ -filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'" \ -target ntsc-dvd YOUR-OUTPUT-HERE.mpg
**注意:**較舊的 ffmpeg 沒有
-filter:v
. 您可以嘗試(未經測試),或者更好地從ffmpeg.org-vf
下載新的靜態建構。