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

自从买了 Downie 之后,就不敢去优酷下载视频,因为他们家下载回来的都是小文件,还需要合并。而 Mac 下我有找不到能合并多个 mp4 文件的工具,只能作罢。

后来发现优酷上下载回来的视频质量还是很高的,所以还是决定在考虑下合并 mp4。之前也听说过通过 ffmpeg 工具可以完成,并且可以非常高速的完成合并。这次就再搜索查找了下。

当时看的文章比较多也比较杂,这次搜索后,主要参考了一篇文章。在此基础上,我稍微整理了下。

见此:使用FFmpeg合并MP4视频

首先是安装 ffmpeg 工具,Windows/MacOS/Linux 都可以。可以自行搜索安装方法。

其中 MacOS 下的方法是:

1
brew install ffmpeg

下文的脚本,以 MacOS 为准。Linux 应该通用。Windows 没用过,不确定。

将多个 mp4 小文件,合并为一个大文件,方法有两种:mpeg 拼接ts 拼接(推荐)

mpeg 拼接

需要先将小 mp4 文件转码为 mpeg 文件,之后 mpeg 直接拼接,最后再转码回 mp4。

此方法速度比较慢,并且最终生成的文件比较大。例如 6 个小 mp4 文件,累计 240MB,通过此方法,最终 mp4 文件会变成 640MB 左右。整个操作用时超过 1 分钟。

1
2
3
ffmpeg -i a1.mp4 -qscale 4 a1.mpg
ffmpeg -i a2.mp4 -qscale 4 a2.mpg
cat a1.mpg a2.mpg| ffmpeg -f mpeg -i - -qscale 6 -vcodec mpeg4 output.mp4

速度慢也就算了,关键是变大太多了。果断舍弃此方案。

ts 拼接(推荐)

整个方法先把 mp4 封装成 ts 格式,之后 ts 直接拼接,最后在转化为 mp4。

此方法速度快,最终文件基本上等于小文件的总和。例如 6 个小 mp4 文件,累计 240MB,通过此方法,最终 mp4 文件也在 240MB 左右。整个操作用时 10 秒。

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
# 将 mp4 文件封装为 ts 格式
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
# 拼接 ts 并导出最终 mp4 文件
ffmpeg -i "concat:1.ts|2.ts|3.ts|4.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
# 删除过程中生成的 ts 文件
rm *.ts

具体操作方案:

  1. 使用 Transnomino(MacOS 下我找到的唯一一个免费且好用的批量更名软件)。先将目录下的 mp4 进行改名,当然也可以使用 MacOS 自带的批量改名功能。改名为 a1.mp4, a2.mp4 …;
  2. 编辑上面的脚本,把它保存到 mp4 目录内,名字无所谓,比如 a.sh
  3. 终端中,cd 到 mp4 的目录,执行 bash a.sh,等待即可;
  4. 最终即可生成 output.mp4 合并好的文件了。

–END–