免费浏览器端媒体工具

如何在不重新编码的情况下合并 MP4 文件

合并 MP4 片段并不一定要重新编码。本文说明流拷贝合并的适用条件、需要对齐哪些参数,以及片段参数不一致时该怎么处理。

如何在不重新编码的情况下合并 MP4 文件

合并 MP4 片段并不一定要重新编码。本文说明流拷贝合并的适用条件、需要对齐哪些参数,以及片段参数不一致时该怎么处理。

「不重新编码的合并」到底指什么

MP4 文件是一个封装容器,里面装着两条已经压缩好的流:一条视频、一条音频。「不重新编码的合并」指的是把片段 A 的压缩数据包按顺序接到片段 B 前面,再为它们重写一份容器索引。整个过程不解码任何一帧,因此也不会对任何一帧重新压缩。

FFmpeg 把这个操作称为流拷贝。它和「逐帧解码后再编码」的合并有本质区别:后者必然消耗更多 CPU 时间,也必然带来画质损失,因为 H.264 和 H.265 编码本身都是有损过程。

必须对齐的五个参数

  • 视频编码器与 Profile:1080p 的 H.264 High Profile 和 4K 的 H.265 Main 不能把数据包直接摆在一起。
  • 分辨率:混入 1920×1080 和 1280×720 两种片段,会打破「所有帧尺寸一致」这个前提。
  • 帧率:30fps 与 60fps 素材的时间戳间隔不同,这正是卡顿和时长漂移的来源。
  • 音频编码、采样率与声道数:44.1kHz 立体声 AAC 和 48kHz 单声道 AAC 不能直接做数据包拼接。
  • 像素宽高比:手机素材常带非方形像素,因此相同的像素数可能显示成不同的画幅比例。

一套稳妥的操作顺序

  • 1. 按想要的顺序把片段加入队列,并确认这个顺序 —— 合并严格按列表执行。
  • 2. 先用快速合并。如果所有片段来自同一台手机、同一台相机或同一套导出预设,这条路通常能成功,而且几乎不占用 CPU。
  • 3. 别把「跑完了」当作流拷贝成功的证据。片段规格不一致时,ffmpeg 有时会返回成功码却写出一个坏文件:muxer 不接受倒退的时间戳,于是后面片段的帧被丢弃,而容器仍然声明着第一个片段的分辨率。拿不准就改用统一重编码 —— 它会以第一个片段为基准对其余片段做缩放、补边和帧率对齐,这一步代价更高,也正是它能在流拷贝做不到的地方成功的原因。
  • 4. 在您真正要用的设备上检查导出文件,重点看衔接处,而不是只看开头几秒。

本地处理的实际代价