转码、转封装与流复制
本教程共 32 篇 · 第 8 篇 · 更新于 2026-08-09 · 约 6 分钟阅读
本节目标:分清三种处理模式,能判断什么时候必须重编码、什么时候
-c copy秒出,并理解背后的速度与画质权衡。
FFmpeg 的操作看似千变万化,本质上可以归为三类:转码、转封装、流复制。这一章把它们讲透,后面的命令你基本都能自己判断该用哪一种。
三种模式对比
| 模式 | 是否换编码 | 是否换容器 | 速度 | 画质损失 |
|---|---|---|---|---|
| 转码 transcoding | 是 | 通常是 | 慢 | 有(有损编码时) |
| 转封装 remuxing | 否 | 是 | 极快 | 无 |
| 流复制 stream copy | 否 | 通常否 | 极快 | 无 |
简单记:只要不重新编码,就非常快且完全无损;一旦重新编码,就慢且可能有损失。
转码(transcoding)
转码是把流从一种编码格式转换成另一种。比如把 H.264 转成 HEVC,把 AAC 转成 MP3。
典型命令:
ffmpeg -i input.mp4 -c:v libx265 -c:a aac output.mp4
这里视频流被 libx265 重新编码成 HEVC,音频流被内置 AAC 编码器重新编码。
为什么要转码
- 兼容性:老设备不支持 HEVC/AV1,要转成 H.264。
- 压缩体积:HEVC 比 H.264 省约一半空间,AV1 更省。
- 改参数:降分辨率、改帧率、调码率必须重编码。
- 加滤镜:缩放、裁剪、加水印、烧字幕都需要解码到原始帧再编码。
- 目标平台要求:某些平台只接受特定编码。
转码的代价
转码要走完整的「解码 → 处理 → 编码」流程,有两个代价:
- 耗时:根据视频长度、分辨率、编码器,可能从几倍速到几十倍速。CPU 编码尤其慢。
- 代际损失:有损编码器每转一次都会损失一点细节。从 H.264 转 H.264 叫「二次压制」,画质会下降。能避免就避免。
Tip转码时尽量从高质量源文件转,不要把已经压过一次的文件再压一次。如果是存档用途,考虑无损编码(FFV1、FLAC)或者干脆保留原始文件。
转封装(remuxing)
转封装是只换容器,不碰编码。把 MKV 里的 H.264 + AAC 原封不动搬进 MP4,就是转封装。
ffmpeg -i input.mkv -c copy output.mp4
速度几乎等于文件拷贝,因为只是把数据包从一个盒子拆出来放进另一个盒子,不做任何解码编码。画质、音质完全不变。
为什么要转封装
- 播放器不支持:某些电视、手机不支持 MKV,但里面的编码本身是 H.264 + AAC,搬进 MP4 就能播。
- 编辑软件要求:PR、Final Cut 偏好 MP4/MOV。
- 流媒体需要:HLS/DASH 需要特定的封装格式。
- 加/删流:替换音轨、加字幕但不改视频,本质也是转封装。
转封装的前提
目标容器必须支持源文件里的所有编码格式。 常见坑:
- MP4 支持 H.264/HEVC/AV1 + AAC/MP3/ALAC,但不支持 FLAC、PCM、ASS 字幕(字幕要转成
mov_text)。 - MKV 几乎万能,什么都能装。
- WebM 只接受 VP8/VP9/AV1 + Vorbis/Opus。
如果容器不兼容,-c copy 会报错或者部分流被丢弃。这时候要么换目标容器,要么对不兼容的流单独转码。
流复制(stream copy)
流复制指用 -c copy 把指定的流直接拷过去,不经过编解码。它可以单独用在某类流上:
# 视频直接复制,音频转成 AAC
ffmpeg -i input.mkv -c:v copy -c:a aac output.mp4
# 只复制音频,丢弃视频(提取音频)
ffmpeg -i input.mp4 -c:a copy output.aac
# 视频复制,音频复制,字幕复制
ffmpeg -i input.mkv -c copy output.mkv
-c 是「所有流」,-c:v 是视频,-c:a 是音频,-c:s 是字幕。你可以对不同流分别指定 copy 或编码器。
流复制的常见用途
- 从视频里提取音频或视频。
- 截取片段但不想重编码(配合
-ss/-t,见 §11)。 - 合并相同编码的多个文件(见 §14)。
- 给视频加音轨、字幕,但保留原视频。
流复制的局限
因为不重新编码,所以不能改任何需要像素级处理的东西:
- 不能缩放、裁剪、旋转画面。
- 不能改分辨率、帧率、码率。
- 不能加视频滤镜。
- 截取时只能从关键帧切开,精度受关键帧间隔限制(§11 详述)。
一个判断流程图
拿到一个任务,按这个顺序问自己:
- 需要换编码吗?(设备不支持、要压缩、要改码率)
- 是 → 必须转码。
- 否 → 继续问。
- 需要改画面或声音内容吗?(缩放、裁剪、水印、滤镜、调速)
- 是 → 必须转码。
- 需要换容器吗?(MKV 转 MP4 等)
- 是 → 转封装,用
-c copy。 - 否,只是剪一段或抽一条流 → 流复制,用
-c copy。
- 是 → 转封装,用
Tip能不转码就不转码。 这是 FFmpeg 使用的第一原则。拿到命令先想:这里真的需要重新编码吗?如果只是换壳、剪一段、抽音轨,
-c copy能帮你省几分钟到几十分钟。
常见写法对照
# 完整转码:H.264 + AAC
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4
# 只转视频,音频直接复制
ffmpeg -i input.mkv -c:v libx265 -c:a copy output.mp4
# 只转音频,视频直接复制
ffmpeg -i input.mkv -c:v copy -c:a libmp3lame -q:a 2 output.mp4
# 转封装:所有流原封不动
ffmpeg -i input.mkv -c copy output.mp4
# 只提取音频,不重编码
ffmpeg -i input.mp4 -vn -c:a copy output.aac
# MKV 转 MP4 但字幕要转成 MP4 支持的 mov_text
ffmpeg -i input.mkv -c:v copy -c:a copy -c:s mov_text output.mp4
最后一个例子值得注意:MKV 里的 ASS/SRT 字幕不能直接复制到 MP4,需要把字幕流转码成 mov_text。视频和音频还是 copy,只有字幕重编码——这就是「混合模式」。
小结
- 转码:重新编码,慢,有损失,只在必须时用。
- 转封装:只换容器,用
-c copy,秒速且无损。 - 流复制:对单条流用
-c:v copy/-c:a copy,同样秒速无损。 - 加滤镜、改分辨率、换编码格式都必须转码。
- 第一原则:能 copy 就 copy。
下一章讲多音轨、多字幕文件里怎么用 -map 精确选择要哪些流。