第一个命令:格式转换
本教程共 32 篇 · 第 4 篇 · 更新于 2026-08-09 · 约 5 分钟阅读
本节目标:跑通你人生第一条 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 会把它们按顺序编号为 0、1、2……
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。