FFmpeg中SAR(Sample Aspect Ratio,采样宽高比)和 DAR(Display Aspect Ratio,显示宽高比)

在 FFmpeg 中,SAR(Sample Aspect Ratio,采样宽高比)DAR(Display Aspect Ratio,显示宽高比) 是描述视频画面比例的两个核心参数,直接影响视频的显示效果(如是否出现黑边、裁剪或拉伸)。以下从定义、区别、FFmpeg 中的查看与设置方法,以及实际应用场景展开详细说明:

一、SAR 与 DAR 的定义

1. SAR(采样宽高比)

SAR 是像素本身的宽高比例,表示每个像素在原始视频中的宽高比。例如:

  • SAR=16:9:每个像素的宽度是高度的 16/9 倍(常见于高清视频)。
  • SAR=4:3:每个像素的宽度是高度的 4/3 倍(传统标清电视)。
  • SAR=1:1:正方形像素(如计算机显示器常用)。

SAR 由视频的编码参数决定,通常在拍摄或编码时固定(如相机传感器的物理比例)。

2. DAR(显示宽高比)

DAR 是视频在显示设备上的实际显示宽高比,表示视频画面最终呈现的宽高比例。例如:

  • DAR=16:9:视频在 16:9 的显示器或电视上完整显示,无黑边。
  • DAR=4:3:视频在 16:9 的显示器上会左右或上下出现黑边(Letterbox 或 Pillarbox)。

DAR 由显示设备的物理比例(如屏幕分辨率、电视制式)决定,可能与 SAR 不同。

二、SAR 与 DAR 的关系

视频的实际显示尺寸由 SAR 和 DAR 共同决定。假设视频的原始分辨率为 W×H(像素数),则:

  • 像素的物理宽度 = ( \frac{W}{\sqrt{W^2 + H^2}} \times SAR宽度 )
  • 像素的物理高度 = ( \frac{H}{\sqrt{W^2 + H^2}} \times SAR高度 )
  • 最终显示的宽高比 DAR = ( \frac{\text{像素物理宽度} \times W}{\text{像素物理高度} \times H} )

简化来说,DAR = (SAR × 原始分辨率宽高比)。例如:

  • 若 SAR=16:9,原始分辨率为 1280×720(宽高比 16:9),则 DAR=16:9(无变形)。
  • 若 SAR=16:9,原始分辨率为 1920×1080(宽高比 16:9),则 DAR=16:9。
  • 若 SAR=4:3,原始分辨率为 1280×720(宽高比 16:9),则 DAR= ( \frac{4}{3} \times \frac{16}{9} \approx 2.37:1 )(罕见,实际中 DAR 通常由显示设备决定)。

三、FFmpeg 中查看 SAR 与 DAR

通过 ffprobeffmpeg -i 命令可查看视频的 SAR 和 DAR 信息。

1. 使用 ffprobe 查看
# 查看视频流的 SAR 和 DAR(输出为分数形式)
ffprobe -v error -select_streams v:0 -show_entries stream=sample_aspect_ratio,display_aspect_ratio -of default=noprint_wrappers=1 input.mp4

输出示例:

sample_aspect_ratio=16:9
display_aspect_ratio=16:9
2. 使用 ffmpeg -i 查看
ffmpeg -i input.mp4 -f null - 2>&1 | grep -E 'Sample Aspect Ratio|Display Aspect Ratio'

输出示例:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 15360 tbn, 60 tbc

其中 [SAR 1:1 DAR 16:9] 直接显示了 SAR 和 DAR。

四、FFmpeg 中设置 SAR 与 DAR

FFmpeg 支持通过编码参数滤镜调整 SAR 和 DAR,常见场景包括:

  • 修正因传感器误差导致的 SAR 错误。
  • 强制视频以特定 DAR 显示(如将 4:3 视频调整为 16:9 并添加黑边)。
1. 调整 SAR(采样宽高比)

SAR 通常由原始视频决定,但可通过 setsar 滤镜强制修改(适用于编码时重新设置)。

示例:将 SAR 从 4:3 修正为 16:9

ffmpeg -i input.mp4 -vf "setsar=16/9" -c:v libx264 -crf 23 output.mp4
2. 调整 DAR(显示宽高比)

DAR 受显示设备限制,但可通过 scale 滤镜或 setdar 滤镜调整视频的显示尺寸(可能添加黑边或裁剪)。

方法 1:使用 scale 滤镜(推荐)

scale 滤镜可调整视频分辨率,从而间接改变 DAR。通过 force_original_aspect_ratio 参数控制是否保持原始 SAR。

示例 1:将视频缩放到 16:9 DAR(保持 SAR)

# 输入视频 SAR=4:3,分辨率 1280x960(DAR=4:3)
# 目标:缩放到 DAR=16:9,保持 SAR=4:3(需计算新分辨率)
ffmpeg -i input.mp4 -vf "scale=iw*16/9:ih*16/9:force_original_aspect_ratio=decrease" -c:v libx264 -crf 23 output.mp4
  • iw*16/9:输入宽度(iw)乘以目标 DAR 宽度比(16/9)。
  • ih*16/9:输入高度(ih)乘以目标 DAR 高度比(16/9)。
  • force_original_aspect_ratio=decrease:避免缩放后宽高比超过目标 DAR(自动缩小)。

示例 2:强制 DAR=16:9(添加黑边)

# 输入视频 SAR=16:9,分辨率 1280x720(DAR=16:9)
# 目标:在 1920x1080 的 16:9 显示器上居中显示(无缩放,无黑边)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" -c:v libx264 -crf 23 output.mp4
  • pad 滤镜:在视频周围添加黑边((ow-iw)/2 为左右边距,(oh-ih)/2 为上下边距)。
方法 2:使用 setdar 滤镜(直接设置 DAR)

setdar 滤镜直接指定 DAR,FFmpeg 会自动计算需要的缩放比例(可能改变 SAR)。

示例:将 DAR 强制设置为 16:9

ffmpeg -i input.mp4 -vf "setdar=16/9" -c:v libx264 -crf 23 output.mp4
  • 注意:setdar 可能与 setsar 冲突,优先使用 scale 滤镜控制 DAR。

五、实际应用中的常见问题

问题 1:视频显示黑边(Letterbox/Pillarbox)
  • 原因:视频的 DAR 与显示设备的 DAR 不一致(如 4:3 视频在 16:9 显示器上)。
  • 解决
    • 保持 SAR 不变,通过 scalepad 滤镜添加黑边(推荐)。
    • 裁剪视频边缘(crop 滤镜),但可能丢失画面内容。
问题 2:视频拉伸变形
  • 原因:强制将 SAR 不匹配的视频缩放到目标 DAR(如将 4:3 视频直接拉伸为 16:9)。
  • 解决:避免直接拉伸,优先使用 force_original_aspect_ratio 参数保持 SAR。
问题 3:FFmpeg 输出 DAR 与预期不符
  • 原因:未正确设置 SAR 或滤镜参数(如 scale 时未考虑原始分辨率)。
  • 解决:通过 ffprobe 确认原始 SAR 和 DAR,再根据目标 DAR 计算正确的缩放参数。

六、总结

  • SAR 是像素的固有宽高比(由传感器或编码决定),DAR 是视频在显示设备上的实际宽高比(由显示设备决定)。
  • FFmpeg 中通过 setsarsetdar 滤镜调整 SAR 和 DAR,但更推荐使用 scale 滤镜控制 DAR(避免变形)。
  • 实际应用中需根据显示设备的 DAR 调整视频尺寸,优先保持 SAR 以避免画面变形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值