在bash脚本中使用FFmpeg(引号)

时间:2015-03-20 19:21:18

标签: bash

我正在处理一个用一些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来处理我想要的东西

你能帮助我吗?

1 个答案:

答案 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
...

为了解释为什么会这样,这就是你预期会发生的事情:

  1. Bash看到ffmpeg $ARGS
  2. Bash替换变量,给出ffmpeg -i 'my arg'
  3. Bash解释新命令,给出参数列表

    ffmpeg-imy arg

  4. Bash使用这两个参数运行ffmpeg

  5. 这是实际发生的事情:

    1. Bash看到ffmpeg $ARGS
    2. Bash解释它并将其拆分为参数

      ffmpeg $ARGS

    3. Bash发现其中一个参数是一个不带引号的变量,因此它splits the value of the variable on spaces并将每个单词放入一个单独的参数中:

      ffmpeg-i'myfile'

    4. Bash使用这些三个参数运行ffmpeg,这些参数现在包含垃圾单引号。