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

将preset作为变量传入时Bash脚本中的ffmpeg命令执行失败

问题

原ffmpeg命令可正常执行:

ffmpeg -v warning -stats -i "${working}" -vf "scale=-1:${CONVERT_HEIGHT}" -c:v libx265 -c:a aac -preset slow -x265-params "crf=22:min-keyint=25:keyint=50" "$writeTo"

将-preset slow存入变量后执行命令:

SLOW_PRESET="-preset slow"
ffmpeg -v warning -stats -i "${working}" -vf "scale=-1:${CONVERT_HEIGHT}" -c:v libx265 -c:a aac $SLOW_PRESET -x265-params "crf=22:min-keyint=25:keyint=50" "$writeTo"

出现报错:

Unrecognized option 'preset slow'.
Error splitting the argument list: Option not found

用set -x调试的输出:

+ CURRENT_RES=720
+ writeTo='sometarget.mp4'
+ original='somesource.wmv'
+ working='some.tmp'
+ [[ 720 -gt 1080 ]]
+ SLOW_PRESET='-preset slow'
+ ffmpeg -v warning -stats -i 'somesource.wmv' -c:v libx265 -c:a aac '-preset slow' -x265-params crf=22:min-keyint=25:keyint=50 'sometarget.mp4'

注:ffmpeg命令直接执行而非保存为字符串,已尝试使用"$SLOW_PRESET"和${SLOW_PRESET},均无效果。使用的Shell版本为GNU bash, version 5.2.15(1)-release (x86_64-slackware-linux-gnu)。

用户推测调试输出中变量被单引号包裹是问题根源,询问是否需要修改变量定义方式。

解决方案

问题核心是带空格的参数被当作单个字符串存储,Bash展开时会把-preset slow作为一个完整参数传给ffmpeg,但ffmpeg需要的是两个独立的部分:选项-preset和对应的参数slow。

推荐方案:使用数组存储参数

用数组将每个独立的参数部分分开存储,调用时用数组展开语法:

# 数组定义,每个元素对应一个独立的命令行参数
SLOW_PRESET=("-preset" "slow")
# 调用时用"${数组名[@]}"展开,确保每个元素成为独立参数
ffmpeg -v warning -stats -i "${working}" -vf "scale=-1:${CONVERT_HEIGHT}" -c:v libx265 -c:a aac "${SLOW_PRESET[@]}" -x265-params "crf=22:min-keyint=25:keyint=50" "$writeTo"

"${SLOW_PRESET[@]}"会将数组的每个元素拆分为独立的命令行参数,ffmpeg就能正确识别选项和对应参数。

不推荐方案:使用eval(存在安全风险)

如果坚持要用普通变量,可通过eval强制拆分参数,但该方式在变量包含特殊字符时易引发安全问题,谨慎使用:

SLOW_PRESET="-preset slow"
eval ffmpeg -v warning -stats -i "${working}" -vf "scale=-1:${CONVERT_HEIGHT}" -c:v libx265 -c:a aac "$SLOW_PRESET" -x265-params "crf=22:min-keyint=25:keyint=50" "$writeTo"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:45:56