使用第一个输入文件的名称重命名输出文件

使用第一个输入文件的名称重命名输出文件

我有一个 mylist.txt 文件列表,其中包含视频,其文件名的结构一致,如下:
2021_03_18_19_30_02.avi
2021_03_18_19_41_02.avi
...

我正在使用 ffmpeg 将所有文件连接成一个文件,如下所示:

ffmpeg  -f concat -safe 0 -i mylist.txt -c copy output.avi

但是,我希望output.avi使用提供的列表中最早的文件名进行重命名(在本例中为 2021_03_18_19_30_02.avi)。一旦将原始文件拼接在一起,我就不需要保留它们了。

我该如何在 win 命令行或者 Linux bash 中做到这一点?

答案1

我不知道 ffmpeg 何时截断输出文件,是在开始处理输入文件之前还是之后。为了避免过早破坏第一个输入文件,我会让 ffmpeg 写入 output.avi,然后如果 ffmpeg 成功退出重命名:

ffmpeg  -f concat -safe 0 -i mylist.txt -c copy output.avi \
  && mv output.avi "$(head -1 mylist.txt)"

甚至使用随机生成的输出名称:

output=$(mktemp)
ffmpeg  -f concat -safe 0 -i mylist.txt -c copy "$output" \
  && mv "$output" "$(head -1 mylist.txt)"

自动删除输入文件:

output=$(mktemp)
if ffmpeg  -f concat -safe 0 -i mylist.txt -c copy "$output"; then
  filename=$(head -1 mylist.txt)
  xargs rm < mylist.txt
  mv "$output" "$filename"
else
  rm "$output"
fi

相关内容