首页 / FFmpeg 入门教程 / 转码、转封装与流复制

FFmpeg 入门教程

转码、转封装与流复制

本教程共 32 篇 · 第 8 篇 · 更新于 2026-08-09 · 约 6 分钟阅读

FFmpeg转码转封装流复制-c copytranscoderemux

本节目标:分清三种处理模式,能判断什么时候必须重编码、什么时候 -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 更省。
  • 改参数:降分辨率、改帧率、调码率必须重编码。
  • 加滤镜:缩放、裁剪、加水印、烧字幕都需要解码到原始帧再编码。
  • 目标平台要求:某些平台只接受特定编码。

转码的代价

转码要走完整的「解码 → 处理 → 编码」流程,有两个代价:

  1. 耗时:根据视频长度、分辨率、编码器,可能从几倍速到几十倍速。CPU 编码尤其慢。
  2. 代际损失:有损编码器每转一次都会损失一点细节。从 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 详述)。

一个判断流程图

拿到一个任务,按这个顺序问自己:

  1. 需要换编码吗?(设备不支持、要压缩、要改码率)
    • 是 → 必须转码。
    • 否 → 继续问。
  2. 需要改画面或声音内容吗?(缩放、裁剪、水印、滤镜、调速)
    • 是 → 必须转码。
  3. 需要换容器吗?(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 精确选择要哪些流。