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

提取视频DAR信息的Bash脚本问题:多DAR值处理求助

解决多DAR值导致的Bash脚本解析问题

我之前也碰到过一模一样的情况!当视频包含多个流(比如不同码率的视频流、字幕流)时,ffmpeg的输出会吐出好几个DAR条目,直接导致你的grep把所有匹配项都捞进来,后续的字符串解析自然就崩了。这里给你两个实用的解决方案:

方案1:快速修复——只取第一个匹配的DAR值

给你的grep命令加个-m 1参数就行,它会让grep找到第一个匹配的DAR后立刻停止搜索,这样DAR变量里就只会保留单个值:

DAR=$(ffmpeg -i "$DOSSIER/$OLD_NAME.$EXTENSION" -hide_banner 2>&1 | grep -i -oP -m 1 "DAR [0-9]+:[0-9]+")
# 若DAR不存在则设为1:1
if [ -z "$DAR" ]; then
    DAR="DAR 1:1"
fi
X_DAR=$(echo "${DAR:4}" | cut -d: -f1)
Y_DAR=$(echo "${DAR:4}" | cut -d: -f2)

-m 1就是限制匹配次数的参数,简单直接解决多值冲突问题。

方案2:更健壮的方案——用ffprobe精准提取视频流DAR

其实用ffmpeg套件里的ffprobe来提取元数据会靠谱得多,它专门用来结构化输出媒体信息,能精准定位到视频流的DAR,完全不会被其他流干扰:

# 用ffprobe获取第一个视频流的DAR值
DAR=$(ffprobe -v error -select_streams v:0 -show_entries stream=display_aspect_ratio -of default=noprint_wrappers=1:nokey=1 "$DOSSIER/$OLD_NAME.$EXTENSION")

# 处理空值或无效的DAR(比如0:0)
if [ -z "$DAR" ] || [ "$DAR" = "0:0" ]; then
    X_DAR=1
    Y_DAR=1
else
    # 直接分割DAR值,省去前缀处理步骤
    IFS=':' read -r X_DAR Y_DAR <<< "$DAR"
fi

这个方案的优势很明显:

  • 只会提取视频流的DAR,不会误抓音频、字幕等其他流的信息
  • ffprobe的输出格式非常稳定,不像ffmpeg的控制台输出可能随版本变化
  • 用read命令直接分割宽高比,代码更简洁,减少字符串截取的出错概率

如果你的环境里还没装ffprobe,它一般和ffmpeg打包在一起,安装ffmpeg时会自动附带。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:54