You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FFmpeg缩放视频并保持SAR与DAR以生成Dash MPD?

解决FFmpeg缩放视频保持宽高比并生成同适配集Dash MPD的问题

要让多个视频流被FFmpeg的-f dash归入同一适配集,必须保证所有流的显示宽高比(DAR)、样本宽高比(SAR)以及编码核心参数完全一致。针对你的需求,下面给出精准的解决方案:

核心问题分析

你之前尝试的滤镜存在这些问题:

  • scale=854:480:硬设分辨率会强制拉伸非16:9的原视频,直接改变DAR,导致和原流不匹配
  • scale=-1:480/scale=-2:480:仅保证宽度为偶数,但未统一SAR和强制对齐目标DAR
  • 含pad和setsar=1的滤镜:若原视频SAR不为1,强制设为1会破坏原DAR逻辑,且未对齐参考流的DAR

正确处理步骤

1. 先获取参考流的DAR(比如原1080p视频)

先确定基准的显示宽高比,确保所有转码流都对齐这个值:

ffmpeg -i input.mp4 -v quiet -print_format json -show_streams | grep -E 'display_aspect_ratio'

假设输出是"16:9",这就是所有流要统一的DAR。

2. 480p转码滤镜(保证DAR、SAR完全匹配)

情况1:原视频DAR和参考流一致(比如都是16:9)

直接按比例缩放,强制SAR为1,确保分辨率为偶数:

-filter:v 'scale=w=trunc(480*16/9/2)*2:h=480,setsar=1'

计算后得到的分辨率是854×480(标准16:9的480p分辨率),SAR=1,DAR=16:9,和原1080p流完全对齐。

情况2:原视频DAR和参考流不一致(比如原视频是4:3)

先按原比例缩放至480高,再用黑边填充到参考流的DAR对应分辨率,保证内容不变形且DAR统一:

-filter:v 'scale=h=480:w=trunc(480*dar/2)*2,setsar=1,pad=854:480:(ow-iw)/2:(oh-ih)/2:black'
  • scale部分:按原视频DAR计算宽度,确保为偶数
  • setsar=1:统一SAR为1,避免FFmpeg因SAR差异识别DAR不一致
  • pad部分:将缩放后的视频填充到854×480,左右加黑边,最终DAR=16:9

3. 完整Dash打包命令示例

同时生成1080p和480p流,归入同一适配集:

ffmpeg -i input.mp4 \
-map 0:v -c:v libx264 -profile:v high -level:v 4.1 -pix_fmt yuv420p -s 1920x1080 -setsar 1 \
-map 0:a -c:a aac -b:a 128k \
-map 0:v -c:v libx264 -profile:v high -level:v 3.1 -pix_fmt yuv420p -filter:v "scale=h=480:w=trunc(480*dar/2)*2,setsar=1,pad=854:480:(ow-iw)/2:(oh-ih)/2:black" \
-map 0:a -c:a aac -b:a 128k \
-f dash output.mpd

注意:必须保证两个视频流的编码参数(profile、level、像素格式)和音频流参数完全一致,否则FFmpeg会将它们分到不同适配集。

4. 验证结果

转码完成后,检查每个流的DAR和SAR是否一致:

ffmpeg -i output_480p.mp4 -v quiet -print_format json -show_streams | grep -E 'display_aspect_ratio|sample_aspect_ratio'

内容的提问来源于stack exchange,提问作者Solaris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:14:55