ffmpeg 第6章 ffmpeg实现文件夹多视频合并 ffmpeg 第6章 ffmpeg实现文件夹多视频合并

2024-11-01

一、两种方法

使用 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
阅读 157