我正在整理一个bash脚本来运行电影渲染作业。 ffmpeg
期望多行文本文件作为连接过滤到join several files的参数之一。像这样:
ffmpeg -f concat -i mylist.txt -c copy output
还有一个选项可以将它全部写在一行中,如下所示:
ffmpeg -f concat -i <(printf "file '%s'\n" A.mp4 B.mp4) -c copy Output.mp4
如何将后者写入bash脚本,用其他变量替换文件名?尝试拆分变量,但不是那个有效的变量。 $A
和$B
变量包含输入文件的路径。
#!/bin/bash
...
TMP_LIST=$(printf "file '%s'\n" ${A} ${B})
APPEND="${FFMPEG} -f concat -i <<< {${TMP_LIST}} -c copy ${OUTPUT}"
# run the concatenation:
$APPEND
答案 0 :(得分:3)
尝试以下方法:
ffmpeg -f concat -i <(printf "file '%s'\n" "$A" "$B") -c copy Output.mp4
答案 1 :(得分:2)
这是获取列表并在命令执行之前将命令存储在变量(数组)中的一种方法。不幸的是,进程替换只能通过将它们作为参数传递给函数来保持活动,所以我们必须在这里使用函数:
#!/bin/bash
LIST_IN_ARRAYS=("$A" "$B") ## You can add more values.
function append {
local APPEND=("$FFMPEG" -f concat -i "$1" -c copy "$2") ## Store the command in an array.
"${APPEND[@]}" ## This will run the command.
}
append <(printf "file '%s'\n" "${LIST_IN_ARRAYS[@]}") "$OUTPUT"
虽然我会这样做,但事情更简单:
function append {
"$FFMPEG" -f concat -i <(printf "file '%s'\n" "${@:2}") -c copy "$1"
}
append "$OUTPUT" "${LIST_IN_ARRAYS[@]}" ## Or
append "$OUTPUT" "$A" "$B"