1. 什么是 FFmpeg
FFmpeg 是音视频处理领域最常用的开源工具链之一,常见用途包括:
- 音视频格式转换
- 编码与转码
- 解复用与复用
- 截取、合并、抽帧
- 获取媒体信息
- 流媒体处理
如果你要系统学习音视频处理,FFmpeg 几乎是绕不过去的基础工具。
2. 先理解几个基本概念
容器
容器负责“承载”多种媒体流,例如:
- MP4
- AVI
- MKV
- TS
- WAV
它描述的是文件组织方式,不等于编码格式。
流
一个容器内部可能同时包含多种流:
- 视频流
- 音频流
- 字幕流
- 附件流
- 数据流
复用 / 解复用
- 复用(mux):把多种流按容器规则打包
- 解复用(demux):把流从容器中拆出来
编码格式
编码格式决定数据如何压缩和表示。
常见视频编码:
- H.264
- H.265
- VP8 / VP9
- AV1
常见音频编码:
- AAC
- MP3
- Opus
编码器
编码器是具体实现某种编码格式的组件,例如:
libx264libx265libvpxaaclibfdk_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 的推荐顺序
建议按下面顺序入门:
- 容器、流、编码格式、编码器
ffprobe看文件信息-c copy的无损流拷贝- 常见音频转码
- 截取、抽流、合并
- 过滤器和更复杂处理链
9. 总结
FFmpeg 最重要的不是死记命令,而是先理解:
- 文件外壳是什么
- 里面装了哪些流
- 每条流用了什么编码
- 目标平台真正需要什么格式
把这几个问题想清楚之后,大部分命令都会变得非常直接。