微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有很多视频被分成三个部分,我想把它们连接起来。 我现在有以下 bash 将文件夹中的视频输出到名为 mergeVideo.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:]]+) 匹配开头的非空格子字符串 字符串 $f 并分配给 shell 变量 BASH_REMATCH[1]。 对于提供的示例文件名,BASH_REMATCH[1] 将分配给 Something
  • [[:space:]]* 匹配零个或多个空格。
  • part[[:digit:]]+ 匹配字符串“part”后跟数字。
  • \.mp4 匹配后缀。

[替代]

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

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

我扩展了 tshiono 的答案,以便能够操作同一文件夹中的所有文件(就像提到的 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。