如何解决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.mp4
、Something part2.mp4
、Something 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 举报,一经查实,本站将立刻删除。