一、两种方法
使用 ffmpeg 合并文件夹中的多个视频文件,可以通过多种方式来实现,具体取决于你希望如何合并这些视频文件。
下面介绍两种常见的方法:
按顺序拼接多个视频文件:适用于希望将多个视频文件按顺序合并成一个视频文件的情况。
将多个视频文件布局在一个视频中:适用于希望将多个视频文件同时显示在一个视频画面中的情况。
二、方法一
按顺序拼接多个视频文件
2.1、创建文本文件
创建一个文本文件 filelist.txt,列出所有要合并的视频文件。
file 'path/to/video1.mp4'
file 'path/to/video2.mp4'
file 'path/to/video3.mp4'
2.2、使用 ffmpeg 进行合并
使用以下命令进行合并
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
如果以下报错:
[mp4 @ 000002031d220b80] Could not find tag for codec pcm_alaw in stream #1,
则使用以下命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy -c:a aac output.mp4
如果你的需求是忽略或者删除不支持的音轨,可以在 FFmpeg 命令中使用 -an 选项来禁止音频通道的处理:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy -an output.mp4
2.3、自动生成 filelist.txt 脚本
如果你有很多视频文件在一个文件夹中,可以使用一个简单的 Bash 脚本来生成 filelist.txt
#!/bin/bash
# Change to the directory containing your video files
cd /path/to/videos
# Generate filelist.txt
ls *.mp4 | while read filename; do
echo "file '$PWD/$filename'" >> filelist.txt
done
三、方法二
将多个视频文件布局在一个视频中
3.1、创建复杂滤镜
使用 filter_complex 指定每个视频的布局位置。
3.2、使用 ffmpeg 进行合并
将两个视频水平拼接
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4
垂直拼接多个视频文件
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]vstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4
创建网格布局(例如2x2网格)
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "\
[0:v][1:v]hstack=inputs=2[top]; \
[2:v][3:v]hstack=inputs=2[bottom]; \
[top][bottom]vstack=inputs=2[v]; \
[0:a][1:a][2:a][3:a]amerge=inputs=4[a]" \
-map "[v]" -map "[a]" -ac 2 output.mp4