繁体   English   中英

bash脚本中的FFmpeg(引号)

[英]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
...

为了解释为什么这样做,这是您期望发生的事情:

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

    ffmpeg-imy arg

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

这是实际发生的情况:

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

    ffmpeg $ARGS

  3. Bash看到其中一个参数是未加引号的变量,因此它将变量的值分割为空格 ,并将每个单词放入一个单独的参数中:

    ffmpeg-i'myfile'

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM