Zsh脚本中格式化日期字符串用于FFmpeg命令时出现滤镜初始化错误的问题
嘿,我来帮你搞定这个问题!你遇到的错误根源是shell变量展开和FFmpeg滤镜参数解析的冲突,尤其是带空格的日期字符串让FFmpeg误判了参数。
先理清楚问题出在哪:你当前写的text='$theDate'有引号嵌套的问题——在zsh的双引号环境里,单引号里的$theDate不会被shell展开成实际的日期字符串,反而会被FFmpeg当成字面量$theDate;就算变量侥幸展开了,带空格的字符串也会被拆分成多个参数,导致FFmpeg误以为你同时提供了text和textfile参数,这才弹出了那个错误提示。
给你两个能完美解决问题的写法:
方法一:转义FFmpeg内部的双引号
在shell里用转义的双引号\"把$theDate包起来,这样既能让shell正确展开变量,又能让FFmpeg把带空格的日期当成一个完整的文本参数:
ffmpeg -y -i "$file" -vf \ "drawtext=text=\"$theDate\":fontcolor=gray:fontsize=$fontSize:x=$width:y=$height:" \ "$output"
这里的\"会被shell解析成字面的双引号,FFmpeg最终看到的就是text="Jun 30, 06:19:48",自然能正确处理带空格和逗号的内容。
方法二:拆分引号包裹变量与固定内容
把需要shell展开的变量(比如$theDate、$fontSize)用双引号单独包裹,固定的滤镜参数部分用单引号包裹,然后拼接在一起:
ffmpeg -y -i "$file" -vf \ 'drawtext=text='"$theDate"':fontcolor=gray:fontsize='"$fontSize"':x='"$width"':y='"$height"':' \ "$output"
这种写法不用转义,单引号里的内容不会被shell解析,双引号里的变量会被正确展开,而且空格不会导致参数被拆分,FFmpeg能完整识别整个drawtext参数。
为啥会出现「Both text and text file provided」错误?
当日期字符串带空格但没被正确包裹时,shell会把空格后面的内容当成新的参数传给FFmpeg的drawtext滤镜。比如错误写法会让FFmpeg收到类似text='Jun' 30, 06:19:48':fontcolor=...的参数,它会把30,误判为textfile=30,参数,这样就同时存在text和textfile两个参数,直接触发了这个错误提示。
备注:内容来源于stack exchange,提问作者coco

