FFmpeg 快速上手

先把容器、编码和常用命令理顺

Posted by Yvain Zhang on March 17, 2026

1. 什么是 FFmpeg

FFmpeg 是音视频处理领域最常用的开源工具链之一,常见用途包括:

  • 音视频格式转换
  • 编码与转码
  • 解复用与复用
  • 截取、合并、抽帧
  • 获取媒体信息
  • 流媒体处理

如果你要系统学习音视频处理,FFmpeg 几乎是绕不过去的基础工具。

2. 先理解几个基本概念

容器

容器负责“承载”多种媒体流,例如:

  • MP4
  • AVI
  • MKV
  • TS
  • WAV

它描述的是文件组织方式,不等于编码格式。

一个容器内部可能同时包含多种流:

  • 视频流
  • 音频流
  • 字幕流
  • 附件流
  • 数据流

复用 / 解复用

  • 复用(mux):把多种流按容器规则打包
  • 解复用(demux):把流从容器中拆出来

编码格式

编码格式决定数据如何压缩和表示。

常见视频编码:

  • H.264
  • H.265
  • VP8 / VP9
  • AV1

常见音频编码:

  • AAC
  • MP3
  • Opus

编码器

编码器是具体实现某种编码格式的组件,例如:

  • libx264
  • libx265
  • libvpx
  • aac
  • libfdk_aac

3. 常用查看命令

查看支持的容器:

ffmpeg -formats

查看支持的编解码器:

ffmpeg -codecs

查看支持的编码器:

ffmpeg -encoders

查看媒体文件信息:

ffmpeg -i input.mp4

或使用更适合脚本场景的:

ffprobe input.mp4

4. 命令行结构

一个典型的 FFmpeg 命令可以理解为:

ffmpeg [全局参数] [输入参数] -i input [输出参数] output

常见参数:

  • -i:输入文件
  • -y:覆盖输出文件
  • -c:v:指定视频编码器
  • -c:a:指定音频编码器
  • -c copy:直接拷贝流,不重新编码
  • -ss:跳转到指定时间点
  • -t:输出指定时长
  • -ar:音频采样率
  • -ac:声道数
  • -b:a:音频码率

5. 最常见的几类操作

查看文件信息

ffprobe input.mp4

转换容器但不重新编码

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

适用于只想换“外壳”,不想改内容的场景。

音频转 MP3

ffmpeg -i input.wav -c:a libmp3lame output.mp3

音频转 AAC

ffmpeg -i input.wav -c:a aac output.m4a

截取一段音视频

ffmpeg -ss 00:00:10 -i input.mp4 -t 00:00:20 output.mp4

表示从 10 秒开始截取 20 秒内容。

只提取音频

ffmpeg -i input.mp4 -vn -c:a copy output.aac

6. 容器转换和转码不要混淆

这是初学时最容易混淆的问题:

  • 容器转换:改文件封装方式,例如 MP4 -> MKV
  • 转码:改编码格式,例如 H.264 -> H.265,AAC -> MP3

有时候只换容器即可,用 -c copy 就够了;有时候目标平台不支持原编码,就必须转码。

7. 使用 FFmpeg 时的实际建议

先看输入,再决定操作

不要一上来就转码,先用 ffprobe 看清楚:

  • 容器是什么
  • 视频编码是什么
  • 音频编码是什么
  • 码率、分辨率、采样率是否符合目标需求

能拷贝就别重编码

重编码会带来:

  • 耗时
  • 额外失真
  • 更多参数选择成本

如果只是改容器或抽流,优先考虑 -c copy

音频参数尽量明确

处理音频时,建议明确这些参数:

  • 采样率 -ar
  • 声道数 -ac
  • 码率 -b:a
  • 编码器 -c:a

8. 学习 FFmpeg 的推荐顺序

建议按下面顺序入门:

  1. 容器、流、编码格式、编码器
  2. ffprobe 看文件信息
  3. -c copy 的无损流拷贝
  4. 常见音频转码
  5. 截取、抽流、合并
  6. 过滤器和更复杂处理链

9. 总结

FFmpeg 最重要的不是死记命令,而是先理解:

  • 文件外壳是什么
  • 里面装了哪些流
  • 每条流用了什么编码
  • 目标平台真正需要什么格式

把这几个问题想清楚之后,大部分命令都会变得非常直接。