FFmpeg原始幀處理-濾鏡設置視頻寬高比
本文為作者原創,轉載請注明出處:http://www.rzrgm.cn/leisure_chn/p/19089092
1. 視頻寬高比的概念:SAR, PAR, DAR
播放器在播放視頻時需要保持播放的圖像和信源物體寬高比例一致,不一致就會導致圖像變形。比如墻上掛有一個正圓形時鐘,經攝像機采集、編碼器編碼、解碼器解碼、播放器播放后,最終在顯示器上呈現的視頻,仍然能看到一個正圓形的時鐘在滴滴答答走動,這才正常。如果顯示器上的時鐘變成了橢圓形,那就是視頻寬高比沒設置好,導致終端和源端不匹配,無法正確還原信源的圖像。
與視頻寬高比相關的有三個概念:SAR (sample aspect ratio),PAR (picture aspect ratio) 和 DAR (dispaly aspect ratio)。在不同的文檔不同的軟件代碼中,這三個概念的名稱或定義可能存在差異,但這三個核心概念的本質是不變的,本文限定在 H.264 編碼流、FFmpeg 工具、PotPlayer 播放器這一組環境中來研究這三個概念。
本文實驗環境:
操作系統:Windows 10
播放器:PotPlayer 250625(1.7.22570)
FFmpeg: 8.0
1.1 SAR (sample aspect ratio)
SAR (sample aspect ratio) 是采樣寬高比,是像素采樣點所占物理空間的寬和高之比,也可理解為像素點的寬和高之比,表示像素的形狀。比如 SAR 為 1:1 表示像素是方形;SAR 為 2:1 表示像素是矩形,像素寬是像素高的 2 倍。既然是采樣寬高比,實際在源端圖像傳感器采集圖像時,就根據被采樣的實物形狀確定了像素形狀,確定了 SAR。
在 H.262 和 H.264 標準文檔里都提到了 SAR。H.262 標準第 6.3.3 節 “Sequence header”提到了 SAR 相關的語法,也提到了 DAR,但是說得不太清楚,不好理解。H.264 標準第 E.2.1 節 “VUI parameters semantics”提到了 SAR 相關的語法,并描述了 SAR 如何影響播放行為,H.264 對 SAR 的描述要清晰很多,我們來看一下 H.264 標準中的 SAR 語法元素:
aspect_ratio_info_present_flag:值 1 表示接 SPS 的 vui_parameters 中存在 aspect_ratio_idc 語法元素,SAR 將由 aspect_ratio_idc 值指定;值 0 表示不存在 aspect_ratio_idc,這種情況 SAR 取默認值 1:1。
aspect_ratio_idc:表示亮度采樣點的 SAR (sample aspect ratio,采樣寬高比)。等于水平方向上兩個相鄰亮度采樣點的距離和垂直方向兩個相鄰亮度采樣點的距離之比,也就是前面說的像素采樣點所占物理空間的寬和高之比。表 E-1 (引處略) 給出了 aspect_ratio_idc 取值的含義,比如:值 1 表示 1:1,值 2 表示 12:11,值 3 表示 10:11,值 255 表示擴展 SAR (Extended_SAR),SAR 值等于接下來的兩個語法元素之比 sar_width : sar_height。
sar_width, sar_height:SAR 的水平尺寸和垂直尺寸,只有當 aspect_ratio_idc 值為 255 (表示 Extended_SAR) 時,這兩個語法元素才會存在,此時 SAR 值等于 sar_width : sar_height。
overscan_info_present_flag:值 1 表示接下來的語法元素 overscan_appropriate_flag 存在,值 0 表示不存在。不存在時,視頻顯示方案未規定。
overscan_appropriate_flag:值 1 表示圖像適合用 overscan (切邊) 顯示。值 0 表示圖像有重要視覺信息不適合 overscan 切邊,則用 underscan 補黑邊或直接顯示 (DAR 與顯示窗口寬高比一樣,即不用切邊也不用補黑邊)。這里提到了 overscan 和 underscan 的概念,在 1.4 節詳細說明。
因為 H.264 碼流里可能存在 SAR 相關的語法元素,所以 SAR 可以從 H.264 碼流中獲取,若碼流中不存在 SAR 語法元素或 SAR 為無效值,則 SAR 取 1:1。
1.2 PAR (picture aspect ratio)
PAR (picture aspect ratio) 是圖像寬高比,是圖像寬度 (單位:像素) 和圖像高度 (單位:像素) 之比。比如分辯率是 1280 x 720 的視頻,其 PAR 等于 1280:720 = 16:9。
因為 H.264 碼流里包含有視頻長寬信息,所以 PAR 也能從 H.264 碼流中獲取。
1.3 DAR (dispaly aspect ratio)
DAR (dispaly aspect ratio) 是顯示寬高比,是圖像在播放器上播放寬度與播放高度之比,告訴播放器應該以什么寬高比例來呈現這幅圖像。DAR 是給播放器使用的,播放器按 DAR 來播放視頻。
H.264 碼流里不包含 DAR 信息。DAR 是根據 SAR 和 PAR 計算出來的:DAR = SAR x PAR。這個計算關系是很容易理解的。
我們看一下 FFmpeg 中計算 DAR 的代碼:
static void dump_stream_format(const AVFormatContext *ic, int i,
int group_index, int index, int is_output,
int log_level)
{
...
if (st->sample_aspect_ratio.num &&
av_cmp_q(st->sample_aspect_ratio, st->codecpar->sample_aspect_ratio)) {
AVRational display_aspect_ratio;
av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
st->codecpar->width * (int64_t)st->sample_aspect_ratio.num,
st->codecpar->height * (int64_t)st->sample_aspect_ratio.den,
1024 * 1024);
av_log(NULL, log_level, ", SAR %d:%d DAR %d:%d",
st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
display_aspect_ratio.num, display_aspect_ratio.den);
}
...
}
上述代碼中,SAR 是 st->sample_aspect_ratio.num : st->sample_aspect_ratio.den,DAR 是 ( st->codecpar->width : st->codecpar->height ) x ( st->sample_aspect_ratio.num : st->sample_aspect_ratio.den ),st->codecpar->width : st->codecpar->height 就是 PAR,只是 FFmpeg 沒有打印 PAR 這個信息,所以這個計算過程就是 DAR = SAR x PAR。
1.4 播放器如何做到播放比例不變形?
視頻按 DAR 指定的寬高比呈現在顯示器上時,視頻的寬高比例就是不變形的。播放器打開視頻文件解碼播放時,很容易拿到視頻的 SAR 和 PAR,根據 SAR 和 PAR 就能計算得到視頻的 DAR。當播放器的播放窗口 (小窗口或全屏) 的寬高比和視頻 DAR 一樣時,視頻可以保持 DAR 比例完整填充播放窗口。當播放器的播放窗口的寬高比和視頻 DAR 不一樣時,播放器要么需要裁切視頻的左右邊緣或上下邊緣,這叫 overscan (過掃描);要么在視頻的左右邊緣或上下邊緣補黑邊,這叫 underscan (欠掃描)。
假設一個視頻的 DAR 是 4:3,將播放器的播放窗口設定為一個固定尺寸的方形窗口,那么播放器播放窗口的寬高比就是 1:1。如果以 overscan 切邊的方式來播放視頻,那么這個視頻左右邊緣會被切掉 1/3 的畫面,如果以 underscan 補黑邊的方式來播放視頻,那么這個視頻的上下邊緣會被添加 1/4 的黑邊,通過切邊或補黑邊的方式,視頻畫面成為 1:1 的方形裝進方形播放窗口,這樣處理,播放出來的視頻內容是不會變形的。播放器是采用 overscan 還是 underscan,根據前述 H.264 中 overscan_info_present_flag 和 overscan_appropriate_flag 這兩個語法元素確定。播放器會優先使用 underscan 補黑邊的方式 (因為這種方式不會丟失視頻內容),除非語法元素中明確指定了要用 overscan 的方式。當然,這也依賴于播放器采取的策略。
如果一個視頻文件的 DAR 是 16:9,播放窗口的寬高比例也是 16:9,那么這個視頻不需要切邊也不需補黑邊,直接就能在播放窗口中鋪滿播放。
如果一個視頻文件的 DAR 是 1:1,播放窗口的寬高比例是 16:9,以 underscan 模式播放視頻時視頻內容的左右邊緣會添加黑邊,這個黑邊是在播放窗口兩側,不是視頻文件中自帶的黑邊,而播放畫面中有效視頻內容仍然是 1:1 方形的。有的電影文件會在視頻內容的頂部和底部包含黑邊,營造電影感,這種黑邊是視頻內容的一部分,和本節所說的播放器 underscan 模式呈現的黑邊是兩碼事。
2. 使用 FFmpeg 濾鏡設置視頻寬高比
本節我們用實驗來研究一下視頻寬高比 SAR、PAR 和 DAR 對播放器播放行為的影響。
我們選用 FFmpeg 自帶的測試圖 testsrc 來作為源視頻文件,后面再使用 FFmpeg 濾鏡來修改這個視頻文件的 SAR,PAR 和 DAR,看看不同的文件播放起來有什么差異。
先看看 testsrc 測試圖長什么樣?直接用 ffplay 播放 testsrc 測試圖,命令如下:
ffplay -f lavfi -i testsrc=size=320x320
可以看到,testsrc 測試圖中有一個計數秒表,中間有一個正圓形:

把 testsrc 測試圖編碼一段視頻文件,命令如下:
ffmpeg -ss 0:0:0 -t 20 -f lavfi -i testsrc=320x320 -c:v libx264 -pix_fmt yuv420p testsrc_320x320.mp4
上述命令中,參數“-f lavfi -i testsrc=320x320”表示選用 testsrc 測試圖作源,尺寸設置為 320x320 像素,參數“-ss 0:0:0 -t 20”表示從 0 秒開始錄制 20 時長的視頻,“-c:v libx264”使用 libx264 編碼器編碼,“-pix_fmt yuv420p”指定像素格式為 yuv420p。
看一下我們生成的視頻文件的格式:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_320x320.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_320x320.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.7.100
Duration: 00:00:20.00, start: 0.040000, bitrate: 32 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x320 [SAR 1:1 DAR 1:1], 29 kb/s, 25 fps, 25 tbr, 12800 tbn, start 0.040000 (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc61.19.101 libx264
PS E:\videos\sar>
可以看到,SAR 是 1:1,DAR 是 1:1,PAR 沒直接打印出來,PAR 是 320:320 = 1:1。
2.1 setsar/setdar 濾鏡設置視頻寬高比
setsar 濾鏡和 setdar 濾鏡是在 FFmpeg 的 vf_aspect.c 中實現的。
先用 setsar 濾鏡設置視頻 SAR 為 16:9,命令如下:
ffmpeg.exe -i .\testsrc_320x320.mp4 -c:v libx264 -vf setsar=sar=16/9 .\testsrc_320x320_sar_16_9.mp4
查看視頻格式:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_320x320_sar_16_9.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_320x320_sar_16_9.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 32 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x320 [SAR 16:9 DAR 16:9], 30 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
可以看到,SAR 為 16:9,PAR 為 320:320 (即 1:1),DAR 為 16:9,DAR 剛好等于 SAR x PAR。如果 ffprobe 探測某個視頻文件格式,打印信息中沒在 SAR 和 DAR 信息,說明這個視頻文件中沒有 SAR 相關語法元素或者 SAR 是無效值,這種情況會將默認值 1:1 用作此視頻的 SAR,我們把這種視頻文件重新轉碼一下,通過濾鏡選項“-vf setsar=sar=1/1”來設置一下 SAR,轉碼新生成的視頻文件再用 ffprobe 探測一下,就可以看到打印出了 SAR 和 DAR 信息,過程略。
再用 setdar 濾鏡設置視頻 DAR 為 16:9,命令如下:
ffmpeg.exe -i .\testsrc_320x320.mp4 -c:v libx264 -vf setdar=dar=16/9 .\testsrc_320x320_dar_16_9.mp4
查看視頻格式:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_320x320_dar_16_9.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_320x320_dar_16_9.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 32 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x320 [SAR 16:9 DAR 16:9], 30 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
可以看到打印信息和前面 setsar 命令生成的視頻文件打印一樣。
實際,setdar 濾鏡是通過改變視頻的 SAR 來改變視頻 DAR 的。猜測 setsar 和 setdar 底層行為一樣:都改變了 SAR,進而改變
了 DAR,不改變視頻尺寸不改變 PAR。說不定這兩個命令生成的文件都一樣,來驗證一下:
PS E:\videos\sar> Get-FileHash .\testsrc_320x320_sar_16_9.mp4 -Algorithm MD5
Algorithm Hash Path
--------- ---- ----
MD5 ED6660476BB251182F8A81584983F583 E:\videos\sar\testsrc_320x320_sar_16_9.mp4
PS E:\videos\sar> Get-FileHash .\testsrc_320x320_dar_16_9.mp4 -Algorithm MD5
Algorithm Hash Path
--------- ---- ----
MD5 ED6660476BB251182F8A81584983F583 E:\videos\sar\testsrc_320x320_dar_16_9.mp4
PS E:\videos\sar>
果然,testsrc_320x320_sar_16_9.mp4 和 testsrc_320x320_dar_16_9.mp4 的 MD5 值一樣,這兩個文件內容完全一樣。
用 PotPlayer 播放一下 testsrc_320x320_dar_16_9.mp4 文件,效果如下:

這是 16:9 的窗口使用 16:9 的比例播放視頻的效果。播放器是按 DAR 值 16:9 創建的播放窗口,視頻的 DAR 是 16:9,視頻和窗口匹配,不需要切邊也不需要補黑邊。視頻內容中的圓變形了,是因為視頻本來 DAR 應該是 1:1,我們故意將 DAR 改成了 16:9,按 16:9 的比例播放視頻當然變形了,圓成了橢圓。
在 PotPlayer 播放畫面上點右鍵,依次點擊 [屬性] -> [文件信息],查看視頻文件信息如下:

播放器根據視頻長寬尺寸可以知道 PAR 是 320:320 = 1:1,播放器也是知道 SAR 的,只是沒顯示出來 (SAR 是 16:9),根據 PAR 和 SAR 算出了 DAR 是 16:9。
播放器可以設置播放寬高比例,在 PotPlayer 播放畫面上點右鍵,點擊 [比例],可以看到有很多比例可以設置:

播放器默認使用“輸出比例(推薦)”,這個“輸出比例”指的就是 DAR 值,還有一個“原始比例”是指 PAR。
不要關閉前面的播放窗口,維持播放窗口是 16:9 的比例不變,改變播放比例為 1:1。在播放畫面上點右鍵,點擊 [比例] -> [原始比例],切換到“原始比例”模式播放視頻,效果如下:

這是 16:9 的窗口使用 1:1 的比例播放視頻的效果。視頻內容中的圓變回正圓了,因為我們設置了播放比例為“原始比例”,也就是 PAR 值 1:1。16:9 的窗口按 1:1 的比例播放視頻不能完全匹配,視頻左右兩側添加了 7/16 畫面寬度的黑邊,這是 underscan 模式。
不要關閉上一步的播放窗口,維持播放比例為 1:1 不變,改變窗口比例為 1:1。在播放畫面上點右鍵,點擊 [屏幕] -> [自定義尺寸設置...],將屏幕尺寸設置為 400x400 像素,播放效果如下:

這是 1:1 的窗口使用 1:1 的比例播放視頻的效果。視頻和窗口匹配,不需要切邊也不需要補黑邊。圓也是正圓,沒有變形。這個圖是用 400x400 的窗口按 PAR 1:1 比例播放 testsrc_320x320_dar_16_9.mp4 文件的效果,同樣在 400x400 播放窗口按 DAR 1:1 比例播放 testsrc_320x320.mp4 文件具有和上圖完全一樣的效果。
2.2 scale 濾鏡設置視頻寬高比
來看一下使用 scale 濾鏡縮放視頻后,視頻寬高比發生了哪些變化。
2.3.1 源中 SAR 有效時 scale 的縮放
用 scale 濾鏡將 testsrc_320x320.mp4 放大到 1280x720 尺寸,命令如下:
ffmpeg.exe -i .\testsrc_320x320.mp4 -c:v libx264 -vf scale=1280x720 .\testsrc_1280x720.mp4
查看一下新生成視頻文件的格式,如下:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_1280x720.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_1280x720.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 146 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 9:16 DAR 1:1], 143 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
testsrc_320x320.mp4 視頻文件的分辨率是 300x300,PAR 是 1:1,SAR 是 1:1,DAR 是 1:1,DAR 值 1:1 表示視頻畫面顯示出來是方形的。轉碼后生成的 testsrc_1280x720.mp4 視頻文件,分辨率是 1280x720,PAR 是 1280:720 = 16:9,SAR 是 9:16,DAR 是 1:1,DAR 值 1:1 使得新生成的視頻在播放時仍然保持方形。所以這個轉碼命令里,scale 濾鏡一方面調整了分辨率,另一方面調整了 SAR,從而使用得 DAR 和源文件保持一致,縮放后的視頻播放并不變形。
播放效果如下:

結論:源中 SAR 有效時,scale 濾鏡會不止作了分辨率轉換,還會調整 SAR 來致力于使新生成的目標視頻不變形。
2.3.2 源中 SAR 無效時 scale 的縮放
先制作一個 SAR 為無效值的視頻文件:
ffmpeg -ss 0:0:0 -t 20 -f lavfi -i testsrc=320x320 -vf setsar=0 -c:v libx264 -pix_fmt yuv420p testsrc_sar_na.mp4
查看一下新生成視頻文件的格式,如下:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_sar_na.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_sar_na.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.040000, bitrate: 32 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 320x320, 29 kb/s, 25 fps, 25 tbr, 12800 tbn, start 0.040000 (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
用 scale 濾鏡將 testsrc_sar_na.mp4 放大到 1280x720 尺寸,命令如下:
ffmpeg.exe -i .\testsrc_sar_na.mp4 -c:v libx264 -vf scale=1280x720 .\testsrc_1280x720_2.mp4
看一下縮放后生成的新文件的視頻格式:
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_1280x720_2.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_1280x720_2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 146 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1280x720, 143 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
未打印 SAR 和 DAR。這種情況,播放器會將 SAR 當作 1:1,PAR 為 1280:720 = 16:9,DAR 為 SAR x PAR = 16:9。源中 SAR 無效,scale 濾鏡只按命令行中的要求調整了分辨率,目標分辨率寬高比與源分辨率寬高比不一樣,視頻變形了。播放效果如下:

結論:源中 SAR 無效時,scale 濾鏡按指定的目標分辨率作轉換,不關注新生成的視頻是否變形。
2.3.3 不改變 SAR 情況下的 scale 的縮放
保持源的寬高比 (PAR) 來縮放目標尺寸,命令如下:
ffmpeg.exe -i .\testsrc_320x320.mp4 -c:v libx264 -vf scale=-1:720 .\testsrc_x720.mp4
ffmpeg.exe -i .\testsrc_1280x720.mp4 -c:v libx264 -vf scale=-1:360 .\testsrc_x360.mp4
上述命令中“-vf scale=-1:720”表示高度設為 720,鎖定源的寬高比自動設置寬度;“-vf scale=-1:360”表示高度設為 360,鎖定源的寬高比自動設置寬度。
查看上述兩條命令新生成的文件的視頻格式:
PS E:\videos\sar> ffprobe.exe -hide_banner testsrc_x720.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testsrc_x720.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 93 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 720x720 [SAR 1:1 DAR 1:1], 90 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
PS E:\videos\sar> ffprobe.exe -hide_banner .\testsrc_x360.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\testsrc_x360.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf62.3.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 67 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 640x360 [SAR 9:16 DAR 1:1], 64 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc62.11.100 libx264
PS E:\videos\sar>
注意前面生成的這個文件 testsrc_1280x720.mp4,其分辨率是 1280 x 720,PAR 是 1280:720=16:9,SAR 是 9:16,DAR 是 1:1。經 scale 濾鏡縮放后生成的視頻文件 testsrc_x360.mp4,其分辨率是 640 x 360,PAR 是 640:360 = 16:9,SAR 是 9:16,DAR 是 1:1。可見,源中 SAR 有效的情況下,在 scale 濾鏡的參數中將長或寬設置為 -1,scale 濾鏡將按源分辨率的寬高比來調整縮放后的視頻分辨率,這種情況,scale 濾鏡只縮放分辨率,而保持 PAR,SAR,DAR 不變,縮放后視頻內容不變形。播放效果如下:

結論:當將 scale 濾鏡參數的長或寬指定為 -1 時,表示此參數由 scale 濾鏡自動計算,使目標分辨率代表的圖像寬高比和源分辨率的圖像寬高比一樣,這種情況只做分辨率轉換,不需調整 SAR,視頻不變形。
3. 參考資料
[1] Glossary: DAR, PAR, and SAR,https://lists.ffmpeg.org/pipermail/ffmpeg-user/2020-September/050282.html
[2] 像素縱橫比基礎知識,https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/design-tools/expression-studio-2/cc294571(v=expression.10)
4. 修改記錄
2025-09-13 V1.0 初稿

浙公網安備 33010602011771號