我正在尝试完成一批 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"
(引文很重要)
但在这种情况下,您可能需要一个函数。很难说,因为您的问题有点模糊。
答案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。