使用 ffmpeg,完成多个 mp4 文件合并


将多个 MP4 文件合并为一个大文件的方法

在使用 FFmpeg 工具将多个 MP4 小文件合并为一个大文件时,有两种常见的拼接方法:MPEG 拼接TS 拼接(推荐)

在Linux上安装FFmpeg

首先需要安装FFmpeg。你可以通过以下命令在终端中安装FFmpeg:

bash
1
2
sudo apt update
sudo apt install ffmpeg

MPEG 拼接

此方法需要将小 MP4 文件转码为 MPEG 文件,然后将 MPEG 文件拼接,最后再转码回 MP4 文件。

步骤如下:

  1. 将小 MP4 文件转码为 MPEG 文件:
    bash
    1
    2
    ffmpeg -i a1.mp4 -qscale 4 a1.mpg
    ffmpeg -i a2.mp4 -qscale 4 a2.mpg
  2. 将 MPEG 文件拼接并转码回 MP4 文件:
    bash
    1
    cat a1.mpg a2.mpg | ffmpeg -f mpeg -i - -qscale 6 -vcodec mpeg4 output.mp4

缺点:

  • 速度较慢,操作用时超过 1 分钟。
  • 文件增大明显。例如,6 个小 MP4 文件总计 240MB,最终生成的 MP4 文件会变成 640MB 左右。

由于上述缺点,我们通常不推荐使用此方案。

TS 拼接(推荐)

此方法先将 MP4 文件封装为 TS 格式,然后直接拼接 TS 文件,最后再转化为 MP4 文件。

步骤如下:

  1. 将 MP4 文件封装为 TS 格式:
    bash
    1
    2
    3
    4
    5
    #! /bin/bash
    ffmpeg -i a1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
    ffmpeg -i a2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
    ffmpeg -i a3.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 3.ts
    ffmpeg -i a4.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 4.ts
  2. 拼接 TS 文件并导出为 MP4 文件:
    bash
    1
    ffmpeg -i "concat:1.ts|2.ts|3.ts|4.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
  3. 删除过程中生成的 TS 文件:
    bash
    1
    rm *.ts

优点:

  • 速度快,整个操作用时约 10 秒。
  • 文件大小基本等同于原始小文件的总和。例如,6 个小 MP4 文件总计 240MB,最终生成的 MP4 文件仍为 240MB 左右。

具体操作方案

  1. 使用以下脚本按照文件修改时间顺序批量重命名MP4文件:
    bash
    1
    2
    3
    4
    5
    6
    #! /bin/bash
    i=1
    for file in $(ls -tr *.mp4); do
    mv "$file" "a$i.mp4"
    i=$((i + 1))
    done
    将此脚本保存为 rename.sh,并在MP4文件所在目录中运行:
    bash
    1
    bash rename.sh
  2. 编辑上述拼接脚本,并将其保存到MP4文件所在的目录内,命名为 concat.sh
  3. 打开终端,cd 到MP4文件所在的目录,执行 bash concat.sh 并等待操作完成;
  4. 最终生成合并好的 output.mp4 文件。