如何在 Bash 脚本中逃避这个问题?

如何在 Bash 脚本中逃避这个问题?

我正在尝试完成一批 3 个视频,将它们留到早上再处理,但其中似乎有特殊字符...我在终端中尝试“原始”操作,它可以工作,但在 bash 脚本中它停止工作

例子:

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i"
args12="-r 29.97 -ss 00:40:30 -vsync 0 -vpre libx264-medium -i"
args2="[in] scale=580:380 [T1],[T1] pad=720:530:0:50 (other arguments with lots of [ and ]"

输出中显示

无法找到适合“scale=580:380”的输出格式,不知道为什么......就像我说的,该命令在命令行中运行良好,只是在脚本中运行不正常

/usr/local/bin/ffmpeg "$args1" "${file}"  -vf "$args2" "$args3" "${args[0]}_${startingfrom}_0001_02.mp4"

答案1

不要将多个参数放在一个变量中,这在非常简单的情况下是可行的,但除此之外只会给你带来麻烦。请改用数组。例如

infile=video.avi
outfile=${infile%.*}.mp4  # video.mp4
args=(
    -r 29.97 
    -t 00:13:30 
    -vsync 0 
    -vpre libx264-medium 
    -vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50"
)
#...
ffmpeg -i "$infile" "${args[@]}" "$outfile"

(引文很重要)

但在这种情况下,您可能需要一个函数。很难说,因为您的问题有点模糊。

Bash常见问题 50

答案2

在这种情况下,如果你希望将 $argsN 作为多个参数传递给 ffmpeg,你实际上想要引用它。要清楚的是,您确实想要引用您设置它的行,因此:

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i" 

是正确的。但是 ffmpeg 行应该看起来像这样:

/usr/local/bin/ffmpeg $args1 "${file}"  -vf $args2 $args3 "${args[0]}_${startingfrom}_0001_02.mp4"

这里的问题是 ffmpeg 需要如下参数数组:

0: /usr/local/bin/ffmpeg
1: -r
2: 29.97
3: -t
...

当您引用包含参数的变量时,它们都会作为单个参数发送,如下所示:

0: /usr/local/bin/ffmpeg
1: -r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
...

由于 ffmpeg 没有单一选项,因此-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i它理所当然地会抱怨。

如果您想要了解参数是如何传递的,可以使用这个简单的 shell 脚本,它将在单独的行上打印传递给它的每个参数:

#!/bin/bash
echo "0: $0"
i=1
for argument in "$@"; do
    echo "${i}: $argument"
    ((i++))
done

答案3

也许你应该尝试args这样定义你的:

args2='[in] scale= .....'

(请注意单引号而不是双引号)。说说你的进展情况。

答案4

看起来 $args1 和 $args12 包含多个选项,但 $args2 看起来应该是 -vf 选项的单个值。因此,您应该省略 $args1 和 $args12 中的引号,以便它们进行分词,但继续引用 $args2。

但是,您报告的错误消息“无法找到适合‘scale=580:380’的输出格式”看起来好像是来自ffmpeg而不是shell。

相关内容