如何合并文件夹中的所有视频以使用FFMPEG制作单个视频文件

X_1*_*X_1 6 python video ffmpeg

我有一个包含20多个视频文件的文件夹,我需要将它们合并为一个长视频文件.如何在Python中使用FFMPEG实现此目的?

我知道以下命令

ffmpeg -vcodec copy -isync -i \ "concat:file1.mp4|file2.mp4|...|fileN.mp4" \
Run Code Online (Sandbox Code Playgroud)

outputfile.mp4

但我宁愿不输入20多个文件的所有名称.

tec*_*oke 12

这就是我最终使用的......

find *.mp4 | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt
Run Code Online (Sandbox Code Playgroud)

它的丑陋让我感到痛苦,但似乎工作正常,它处理文件名中的空格.另外,不确定OP为什么要问python - 当一些肮脏的老bash/sed会做伎俩时,不需要使用像python这样可爱的东西!;)

ps:我知道这是一个古老的帖子,但如果谷歌搜索"ffmpeg concat"把我带到这里,它可能会带来其他可怜的灵魂.请注意,如果您的所有文件具有相同的设置/编解码器,则上述操作可能会起作用.

  • 我已经用你的脚本删除了文件夹视频中的所有文件!警告 (2认同)
  • 很抱歉听到戴夫!https://www.reddit.com/r/ProgrammerHumor/comments/7u92m8/i_installed_the_chrome_owo_extension_to_force/ (2认同)

Gau*_*ora 11

可以是单行 bash 命令:

for f in *.mp4 ; do echo file \'$f\' >> list.txt; done && ffmpeg -f concat -safe 0 -i list.txt -c copy stitched-video.mp4 && rm list.txt
Run Code Online (Sandbox Code Playgroud)

确保所有视频文件的帧大小和音视频编解码器完全相同。

否则,您可以在连接时转换它们:

for f in *.mp4 ; do echo file \'$f\' >> list.txt; done && ffmpeg -f concat -safe 0 -i list.txt -s 1280x720 -crf 24 stitched-video.mp4 && rm list.txt
Run Code Online (Sandbox Code Playgroud)


Abd*_*des 8

用这个:

cat *.mp4  | ffmpeg  -i pipe: -c:a copy -c:v copy all.mp4
Run Code Online (Sandbox Code Playgroud)

另一个解决方案:

创建一个像这样的文本文件:

我的列表.txt

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
Run Code Online (Sandbox Code Playgroud)

并使用 ffmpeg concat:

ffmpeg -f concat -i mylist.txt -c copy all.mp4
Run Code Online (Sandbox Code Playgroud)

更多信息

  • 窗户不唤醒 (4认同)

lex*_*ore 5

这是一个 Windows 批处理文件,用于连接.avi目录中的所有文件:

for %%f in (*.avi) do (
    echo file %%f >> list.txt
)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.avi
del list.txt
Run Code Online (Sandbox Code Playgroud)

请参阅ffmpeg 文档中的连接

  • NVM,以下内容有帮助,https://superuser.com/questions/1574718/ffmpeg-wont-work-if-filename-has-spaces。不要使用双引号,而是使用单引号,echo file '%%f' >> list.txt,然后在 for 功能块之后和语句“ffmpeg -f concat -safe...”之前,将以下语句放在其上自己的行, sed -i "s/\"/'/g" list.txt (2认同)

use*_*275 2

如果 ffmpeg 不喜欢 *.mp4,你可以这样做来代替文件列表;

ls -1 *.mp4 | perl -0pe 's/\n/|/g;s/\|$//g'
Run Code Online (Sandbox Code Playgroud)

但我认为你的例子不遵循规范,所以你可能想要这个:

for F in *.mp4 ; do
    ffmpeg -i $F -c copy -bsf:v h264_mp4toannexb -f mpegts $(echo $F | perl -pe 's/mp4$/ts/g');
done
ffmpeg -i "concat:$(ls -1 *.ts | perl -0pe 's/\n/|/g;s/\|$//g')" -c copy -bsf:a aac_adtstoasc outputfile.mp4
Run Code Online (Sandbox Code Playgroud)

也看到这个类似的问题