现在我写脚本已经很长时间了,但最近这个问题让我抓狂。我尝试了一切但无法解决它。
find . -iname "*.mp4" -type f -exec ffmpeg -i "{}" -c:a "$ACODEC" -c:v "$VCODEC" -vf \
"subtitles={}.$SUBEXTE:'force_style=fontsize=$FSIZE,fontname=$FNAME'" \
"{}.$EXTE" -hide_banner \;
这个想法是每当find
找到 mp4 文件时,执行此FFmpeg
命令。但是当我想尝试更复杂的东西时,比如最后一个变量的命令替换{}.$EXTE
,我必须使用以下语法:
find . -iname "*.mp4" -type f -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3"\
-vf "subtitles=$1.$4:'force_style=fontsize=$5,fontname=$6'" \
"$1.$7" -hide_banner' -- "{}" "$ACODEC" "$VCODEC" "$SUBEXTE" "$FSIZE" "$FNAME" "$EXTE" \;
正如您在使用此语法时看到的那样sh -c
,我需要添加额外的单引号' '
。但这打破了FFmpeg
密码。我尝试了几乎所有可能的变化;添加和删除单双引号,甚至尝试反斜杠。请帮我!我遇到的一些错误:
Unable to open ./sub.srt
[AVFilterGraph @ 0x7fffdb7d35e0] Error initializing filter 'subtitles' with args './sub.srt:force_style=fontsize='
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!
And sometimes I got an error like not suitable format for fontname
答案1
单引号字符串永远不能包含单引号。
在您的情况下,解决此难题的方法是将'
内联sh -c
脚本中的每个内部替换为'\''
(或'"'"'
)。
这样做的目的是
- 暂时脱离单引号字符串(第一个
'
结束'\''
单引号字符串), - 插入一个文字
'
(\'
in'\''
,你也可以写成"'"
,但那是远的太多的引用导致其难以阅读),然后 - 将其与剩余的原始单引号字符串连接起来(最后的
'
in'\''
开始一个新的单引号字符串)。
该sh -c
命令看起来像
sh -c '
ffmpeg -i "$1" -c:a "$2" -c:v "$3" \
-vf "subtitles=$1.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
"$1.$7" -hide_banner' ...arguments as before ...