我正在处理一个用一些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来处理我想要的东西
你能帮助我吗?
答案 0 :(得分:1)
好吧,让我们have a look:
$ 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.
根据建议,我们use an array:
#!/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发现其中一个参数是一个不带引号的变量,因此它splits the value of the variable on spaces并将每个单词放入一个单独的参数中:
ffmpeg
,-i
,'my
,file'
Bash使用这些三个参数运行ffmpeg,这些参数现在包含垃圾单引号。