簡介與其他資料:
http://www.mobile01.com/topicdetail.php?f=510&t=3734550
其他範例:
http://www.mobile01.com/topicdetail.php?f=510&t=4487462
說明
維持顯示比例計算方法:
http://www.mobile01.com/topicdetail.php?f=510&t=4038239
Crop/Scale/Pad/Setsar/Setsar Filter 可用參數
Crop/Scale/Pad Filter:
w: 設定目標(裁切/縮放/填充後的)寬度。
h: 設定目標(裁切/縮放/填充後的)高度。
Crop/Pad:
x: 設定左裁切/填充寬度。
y: 設定上裁切/填充高度。
Setsar Filter:
r: 設定目標 SAR (PAR)。
Setdar Filter:
r: 設定目標 DAR。
例:
片源: 1920x1080 [PAR 1:1, DAR 16:9]
上下裁切 140 像素高度然後縮放到 1280x534 並填充上黑邊 92、下黑邊 94:
-vf "crop='w=1920:h=800:y=140',scale='w=1280:h=534',pad='w=1280:h=720:y=92'"
Crop/Scale/Pad Filter 可用變數
iw: 輸入影像的寬度。
ih: 輸入影像的高度。
sar: 輸入影像的像素寬高比(PAR)。
dar: 輸入影像的顯示寬高比例。
ow: 輸出影像的寬度(也就是 w 所得到的值)。
oh: 輸出影像的高度(也就是 h 所得到的值)。
例:
-vf "scale='w=iw/2:h=ih'"
假設片源是 800x300 (PAR 1:1, DAR 8:3):
在 scale 中 iw、ih、dar 代表 800、300、8/3
w=iw/2=800/2=400
h=ih=300
Scale 後 FFmpeg 會自動改變 PAR(SAR) 來維持 DAR。
dar = w/h*sar = 400/300 * sar = 8/3
sar = 8/3*300/400 = 2
最終會輸出: 400x300 [PAR 2:1, DAR 8:3]
例:
-vf "scale='w=iw/2:h=ih',setsar='r=1/1',pad='w=iw+32:h=ih+16:x=(ow-iw)/2:y=(oh-ih)/2'"
假設片源是 800x300 (PAR 1:1, DAR 8:3):
在 scale 中 iw、ih、dar 代表 800、300、8/3
在 pad 中 iw、ih、dar、ow、oh 代表 400、300、4/3、432、316
最終會輸出: 432x316 [PAR 1:1, DAR 432:316]
SAR (PAR)
若使用了 scale filter 來改變了解析度的寬或高,FFmpeg 會自動調整輸出影像的 SAR (PAR) 來維持顯示比例。
例如片源 1920x1080 [PAR 1:1, DAR 16:9],上下各裁切 140 高度,再縮放為 1280x536:
-vf crop=1920:800:0:140,scale=1280:536
Output = 1280x536 [PAR 201:200, DAR 12:5]
※ Scale Filter 輸入影像顯示比例:
InputDAR = 1920 / 800 * 1 / 1 = 12 / 5 (2.4:1)
若想要得到正方形像素 (PAR 1:1),不介意那些微的顯示比例失真,可以使用 setsar filter。
強制輸出正方形像素:
-vf crop=1920:800:0:140,scale=1280:536,setsar=1/1
Output = 1280x536 [PAR 1:1, DAR ~2.388:1]
自動寬或高
在 scale filter 中將寬或高其中之一設為 -1,FFmpeg 將會並自動計算出維持顯示比例所需要的值 (輸出強制為方形像素)。
指定縮放寬度,自動高度並維持顯示比例:
-vf scale=1280:-1
承上,當輸入影像的 DAR 為 2.4:1 時,FFmpeg 會令輸出影像高度為 533 來維持 DAR 不變。
如果要確保所得到的值能夠被 n 所給整除,必須使用 -n 作為設定值。
例如使用 -16 會"向上"取最接近的 16 的倍數,也就是說會取 544 而不是最接近的 528。
將圖片寬度縮小到 1280 並維持顯示比例:
-vf scale=1280:-1
將影片寬度縮小到 1280 ,自動高度維持顯示比例 (高度取能被 4 整除的數):
-vf scale=1280:-4
自訂計算公式
在 crop/scale/pad filter 中 w、h、x、y 參數允許使用者使用自定計算公式作為設定值。
將影片寬度縮小到 1280,自動高度維持顯示比例 (高度取最接近的 8 的倍數):
-vf "scale=1280:'trunc(ow/dar/8+0.5)*8'"
trunc(x): 對 x 取整數。
trunc(x+0.5): 對 x 四捨五入取整數。
trunc(x/16+0.5)*16: 取最接近x的16倍數。
承上,當寬度超過 1280 時縮放:
-vf "scale='min(1280,trunc(iw/8+0.5)*8):trunc(ow/dar/8+0.5)*8'"
min(x, y): 回傳數值較大者。例如: min(10,100) = 100
應用範例
使用 FFmpeg 做 Resize 時,不需要人工計算,你只要寫計算式讓它自動計算即可。
1. Stretch
寬度 720, 高度 480, PAR 自動
-vf "scale='w=720:h=480'"
2. Fit to Width
寬度 1280, PAR 1:1, 自動高度 (mod8)
-vf "scale='w=1280:h=trunc(ow/dar/8+0.5)*8',setsar='r=1/1'"
3. Fit to Height
高度 720, PAR 1:1, 自動寬度 (mod16)
-vf "scale='w=trunc(oh*dar/16+0.5)*16:h=720',setsar='r=1/1'"
4. Fit to Both
縮小到 704x480 以下,且 PAR 1:1 並維持顯示比例。
-vf "scale='w=min(704,trunc(480*dar/2+0.5)*2):h=min(480,trunc(704/dar/2+0.5)*2)',setsar='r=1/1'"
5. Loose
寬度 1280, 自動高度 (mod8), PAR ~1 (微調 PAR 使 DAR_Error 為 0)
-vf "scale='w=1280:h=trunc(ow/dar/8+0.5)*8'"
6. Letterbox
寬度 720, 高度 480, PAR 40:33
-vf "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'"或
-vf "pad='w=max(iw,trunc(ih/sar*720/480*40/33/2+0.5)*2):h=max(ih,trunc(iw*sar*480/720*33/40/2+0.5)*2):x=(ow-iw)/2:y=(oh-ih)/2',scale='w=720:h=480',setsar='r=40/33'"
寬度 720, 高度 480, PAR 40:33 (左右往內 8 像素為不可用區域)
-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=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'"