使用 ffmpeg 可以将多个 MP4 文件按顺序合并成一个视频文件。以下是具体步骤:
常规合并
1. 创建一个文本文件列出所有要合并的文件
首先,创建一个文本文件(例如 input.txt),并在其中列出所有要合并的 MP4 文件路径,每个文件占一行。例如:
echo "file 'video1.mp4'" > input.txt
echo "file 'video2.mp4'" >> input.txt
echo "file 'video3.mp4'" >> input.txt
2. 使用 ffmpeg 进行合并
然后,使用以下命令将这些文件合并成一个视频文件:
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
参数说明:
-f concat
:指定输入格式为 concat,用于合并文件。-safe 0
:允许使用相对路径或绝对路径的文件列表。-i input.txt
:指定输入文件列表。-c copy
:直接复制视频和音频流,不进行重新编码,速度较快。output.mp4
:输出的合并后的视频文件名。
注意事项:
如果视频文件的编码格式不一致,可能需要先进行转码,确保它们具有相同的编码格式、分辨率和帧率。
如果视频文件的编码格式一致,-c copy 可以直接合并,速度较快。
不使用 input.txt 列表文件的命令行合并
ffmpeg 的 -i 参数主要用于指定输入文件,但它本身并不支持直接传入多个文件名来合并视频。不过,你可以通过其他方式手动指定多个输入文件,而无需使用 input.txt 文件。
方法 1:使用 concat 过滤器
ffmpeg 的 concat 过滤器可以直接在命令行中指定多个输入文件,并将它们合并成一个视频文件。
命令格式:
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4
参数说明:
-i video1.mp4 -i video2.mp4 -i video3.mp4
:指定多个输入文件。-filter_complex
:启用复杂过滤器。[0:v][0:a][1:v][1:a][2:v][2:a]
:分别引用每个输入文件的视频流 (v) 和音频流 (a)。concat=n=3:v=1:a=1
:指定合并 3 个文件,每个文件包含 1 个视频流和 1 个音频流。[v][a]
:合并后的视频流和音频流。-map "[v]" -map "[a]"
:将合并后的视频和音频流映射到输出文件。output.mp4
:输出的合并文件。
方法 2:使用 -i 多次指定输入文件
如果你不想使用过滤器,也可以通过多次使用 -i 参数指定输入文件,然后使用 -c copy 直接复制流。
命令格式:
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -c copy output.mp4
注意事项:
这种方法要求所有输入文件的编码格式、分辨率、帧率等完全一致,否则可能会导致合并失败或输出文件异常。
如果输入文件的编码格式不一致,建议使用方法 1 的 concat 过滤器。
总结
- 如果需要更灵活的处理(如编码格式不一致),推荐使用 方法 1(concat 过滤器)。
- 如果输入文件的编码格式完全一致,可以使用 方法 2(多次 -i 参数)。
- 如果需要更简单的文件列表管理,仍然可以使用 input.txt 文件的方式。
使用 ffmpeg 分隔视频的介绍可参考如下文章: