首页 / FFmpeg 入门教程 / 第一个命令:格式转换

FFmpeg 入门教程

第一个命令:格式转换

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

FFmpeg格式转换转码转封装第一个命令-i容器

本节目标:跑通你人生第一条 ffmpeg 命令,看懂它背后到底做了什么。

最简单的转换

准备一个视频文件,比如 input.avi,在它所在的目录打开终端,输入:

ffmpeg -i input.avi output.mp4

回车,屏幕上会滚过一堆数字,最后停下来。目录里多出一个 output.mp4,完成。

这条命令的意思非常直白:

  • -i input.avi:输入文件是 input.avi
  • output.mp4:输出文件叫 output.mp4

我们没指定任何编码器,FFmpeg 会根据输出文件的扩展名 .mp4 自动选择默认编码器(通常视频是 H.264,音频是 AAC)。

Note

如果输出文件已经存在,FFmpeg 会停下来问你要不要覆盖。加 -y 可以直接覆盖:

ffmpeg -y -i input.avi output.mp4

背后发生了什么

就一行命令,背后其实走了四步。理解这个流程,后面所有操作都只是在这四步里做选择。

第一步:解封装(demux)

打开容器,把里面的视频流、音频流、字幕流拆出来。容器就是 MP4、MKV、AVI 这些「壳」。这一步不涉及压缩内容,只是把数据从壳里取出来。

第二步:解码(decode)

把压缩过的视频流、音频流还原成原始的帧数据(视频是一帧帧图像,音频是一串串采样)。这一步由解码器完成。

第三步:编码(encode)

把原始的帧数据用新的编码器重新压缩。比如原来用的是 MPEG-4,现在用 H.264。

第四步:封装(mux)

把新压缩好的视频流、音频流打包进新的容器里,比如写进 MP4。

整个过程可以画成这样:

input.avi
   │ 解封装

视频流(已编码) + 音频流(已编码)
   │ 解码

原始帧 + 原始采样
   │ 编码(新编码器)

新视频流 + 新音频流
   │ 封装

output.mp4

这就是一次完整的「转码」(transcoding):既换了容器,也换了编码。

显式指定编码器

不让 FFmpeg 猜,自己指定更稳妥:

ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
  • -c:v libx264:视频用 libx264 编码器,也就是 H.264。
  • -c:a aac:音频用 FFmpeg 内置的 AAC 编码器。
  • -c-codec 的简写,v 是 video,a 是 audio。

如果还有字幕流,对应是 -c:s(subtitle)。

只换容器,不换编码

有时候原视频的编码已经是你想要的,只是想换个容器(比如把 MKV 里的视频装进 MP4)。这时候不需要重新编码,用「流复制」就行:

ffmpeg -i input.mkv -c copy output.mp4

-c copy 表示所有流都直接复制,不做解码和编码。速度极快,几乎是磁盘拷贝的速度,而且画质完全无损。

但有个前提:新容器必须支持原有的编码格式。比如 MP4 不支持 DTS 音频,MKV 里的某些字幕格式 MP4 也不认。强行复制会报错或者播放异常。

Tip

转码 vs 转封装,是 FFmpeg 最核心的两个概念。后面 §08 会专门展开讲。现在记住:能 copy 就 copy,必须转码才转码

输入和输出的写法

多个输入

可以有多个 -i,FFmpeg 会把它们按顺序编号为 012……

ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4

这会把两个文件的流合并到一个输出里。具体怎么选流,需要用 -map,§09 会讲。

文件名带空格

用引号把文件名包起来:

ffmpeg -i "my video.mp4" "my output.mp4"

相对路径和绝对路径

直接写文件名默认在当前工作目录找。也可以写绝对路径:

ffmpeg -i /Users/me/Movies/input.mov ~/Desktop/output.mp4

Windows 下注意路径用反斜杠或正斜杠都行,但在 PowerShell 里有空格要加引号:

ffmpeg -i "D:\videos\my video.mp4" "D:\out\output.mp4"

看懂处理日志

跑命令时,屏幕上会刷类似这样的信息:

frame=  512 fps=120 q=28.0 size=    2048kB time=00:00:20.00 bitrate= 838.9kbits/s speed=4.8x

逐段解释:

  • frame=512:已经处理了 512 帧。
  • fps=120:每秒处理 120 帧,数字越大越快。
  • q=28.0:当前量化参数,反映压缩质量。
  • size=2048kB:目前输出文件大小。
  • time=00:00:20.00:已经处理到第 20 秒。
  • bitrate=838.9kbits/s:输出的当前码率。
  • speed=4.8x:处理速度是播放速度的 4.8 倍。

转码时看 speed 就能估计还要等多久。如果显示 speed=1x,说明处理和实时播放一样慢;如果是 20x,就很快了。

一个完整的例子

把一个 FLV 文件转成 MP4,视频用 H.264、音频用 AAC,自动覆盖已有文件:

ffmpeg -y -i input.flv -c:v libx264 -c:a aac output.mp4

如果原文件本来就是 H.264 + AAC,只是封装在 FLV 里,那直接复制更快:

ffmpeg -y -i input.flv -c copy output.mp4

小结

  • 最简单的命令:ffmpeg -i 输入 输出
  • 背后四步:解封装 → 解码 → 编码 → 封装。
  • -c:v-c:a 指定编码器,用 -c copy 跳过编码直接复制。
  • 日志里看 speed 判断快慢。

下一章我们看看另外两个工具:ffplay 和 ffprobe。