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.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:]]+)
从开头匹配一个非 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
我有很多视频分成三部分,我想把它们拼接起来。 我现在有以下 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.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:]]+)
从开头匹配一个非 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