[英]FFmpeg in a bash script ( quotes )
我正在使用一些ffmpeg命令打开文本文件的脚本。 (从另一个项目生成的大约10条命令)当我手动将粘贴复制到终端中时,每个命令都可以使用,但是当脚本运行时,简单的命令可以工作,但是我却遇到了“没有这样的过滤器:...”错误。
这是我的命令: -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4
我认为所有问题都出在“”中,我试图用“ \\”进行转义,但ffmpeg告诉我No such filter: '''
这是我的脚本,假设变量ARGS是动态设置的(例如,我已经手动设置了它):
#!/bin/bash
ARGS="-i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4"
ffmpeg ${ARGS}
编辑1:
好吧,我忘了精确说明我的文本文件是这样的:
-loop 1 -f image2 -c:v png -i FILE_0.data -i sample.wav -map 0:v -map 1:a -t 20 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 4.mp4
-loop 1 -f image2 -c:v png -i black.png -i sample.wav -map 0:v -map 1:a -t 14 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 5.mp4
-loop 1 -f image2 -c:v png -i FILE_1.data -i sample.wav -map 0:v -map 1:a -t 20 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -pix_fmt yuv420p -y 6.mp4
-i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4
在此文件中,我阅读了每一行,并将该行传递给ffmpeg以处理我想要的内容
你能帮助我吗 ?
好吧,让我们看一下 :
$ shellcheck yourscript
ARGS="-i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -i 5.mp4 -i 6.mp4 -filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]' -map '[v]' -map '[a]' -aspect 16:9 -s 1280x720 -c:v mpeg4 -c:a libmp3lame -y track_0.mp4"
^-- SC2089: Quotes/backslashes will be treated literally. Use an array.
In yourscript line 3:
ffmpeg ${ARGS}
^-- SC2090: Quotes/backslashes in this variable will not be respected.
按照建议,让我们使用一个数组 :
#!/bin/bash
args=(
-i "1.mp4"
-i "2.mp4" ...
-filter_complex '[0:0][0:1][1:0][1:1][2:0][2:1][3:0][3:1][4:0][4:1][5:0][5:1]concat=n=6:v=1:a=1:unsafe=1 [v] [a]'
-map '[v]'
-map '[a]'
-aspect 16:9
....
)
ffmpeg "${args[@]}"
显然,如果您动态构建数组(例如,使用
args=()
for f in 1.mp4 2.mp4
do
args+=(-i "$f")
done
...
为了解释为什么这样做,这是您期望发生的事情:
ffmpeg $ARGS
ffmpeg -i 'my arg'
Bash解释了新命令,并给出了参数列表
ffmpeg
, -i
, my arg
Bash使用这两个参数运行ffmpeg
这是实际发生的情况:
ffmpeg $ARGS
Bash对其进行解释并将其拆分为参数
ffmpeg
$ARGS
Bash看到其中一个参数是未加引号的变量,因此它将变量的值分割为空格 ,并将每个单词放入一个单独的参数中:
ffmpeg
, -i
, 'my
, file'
Bash使用这三个参数运行ffmpeg,这三个参数现在包含垃圾单引号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.