提取视频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
相关产品推荐
相关产品推荐

