FFmpeg如何连接视频并输出相同的文件前缀

How does FFmpeg concat videos and output same file prefix

我有很多视频分成三部分,我想把它们拼接起来。 我现在有以下 bash 将文件夹中的视频输出到名为 mergedVideo.mp4 的文件。

for f in *.mp4 ; do echo file \'$f\' >> fileList.txt;done
ffmpeg -f concat -safe 0 -i fileList.txt -c copy mergedVideo.mp4

我所有的输入文件都像 Something part1.mp4Something part2.mp4Something part3.mp4 我想要的是输出一个名为 Something.mp4

的文件

有可能吗? 我怎样才能修改我的 bash 来实现它~?

请您尝试以下操作:

#!/bin/bash

pat="^([^[:space:]]+)[[:space:]]*part[[:digit:]]+\.mp4$"
for f in *.mp4; do
    echo file \'$f\' >> fileList.txt
    [[ $f =~ $pat ]] && mergedvideo="${BASH_REMATCH[1]}.mp4"
done
ffmpeg -f concat -safe 0 -i fileList.txt -c copy "$mergedvideo"

正则表达式的解释$pat:

  • ^([^[:space:]]+) 从开头匹配一个非 space 子串 字符串 $f 并分配给 shell 变量 BASH_REMATCH[1]。 至于提供的示例文件名,BASH_REMATCH[1] 将分配给 Something.
  • [[:space:]]* 匹配零个或多个白色space(s).
  • part[[:digit:]]+ 匹配后跟数字的字符串“part”。
  • \.mp4 匹配后缀。

[备选]

如果您也熟悉 sed,以下内容可能更具可读性和可维护性:

mergedvideo=$(sed -E 's/[[:space:]]*part[[:digit:]]+//' <<< "$f")

我扩展tshiono's answer to be able to manipulate all the files in the same folders (just like Marinos An提到的,想法是合并具有相同前缀的文件)

案例如包含以下文件的文件夹:

  • 星期一蓝色part1.mp4
  • 周一蓝part2.mp4
  • 星期二.mp4
  • 星期三part1.mp4
  • 星期三part2.mp4
  • 星期三part3.mp4

预期输出:

  • 周一蓝.mp4
  • 星期二.mp4
  • 星期三.mp4
#!/bin/bash

pat="^(.+)[[:space:]]+part[[:digit:]]+\.mp4$"
for f in *.mp4; do
    if [[ $f =~ $pat ]]; then
        echo file \'$f\' >> "${BASH_REMATCH[1]}.txt"
    fi
done

for f in *.txt; do
    ffmpeg -f concat -safe 0 -i "${f%%.*}.txt" -c copy "${f%%.*}.mp4"
done