1

我正在整理一个 bash 脚本来运行电影渲染作业。ffmpeg期望多行文本文件作为连接过滤器的参数之一,以将多个文件合并为一个。像这样:

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
4

2 回答 2

3

尝试以下操作:

ffmpeg -f concat -i <(printf "file '%s'\n" "$A" "$B") -c copy Output.mp4
于 2013-09-03T11:09:41.867 回答
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"
于 2013-09-03T11:38:14.290 回答