2. 多媒体基础
说实话,FFmpeg 是我工具箱里最离不开的东西之一。做多媒体流系统这些年,从转码、切片到流媒体封装,几乎每天都在跟它打交道。这一章,咱们就把它装好、配好,再上手几个最常用的命令。
别小看这一步。我见过不少新手,装完 FFmpeg 就跑,结果遇到「找不到库」「编码器不支持」之类的问题,折腾半天。嗯,咱们一次搞定。
FFmpeg 是什么?
FFmpeg 是一个开源的多媒体处理框架。说白了,它能处理几乎所有你能想到的音视频格式——转码、剪辑、拼接、提取音频、推流、录屏……功能极其强大。
它的核心组件就几个:
- ffmpeg:主程序,负责转码、处理音视频
- ffplay:一个轻量级播放器,用来快速预览
- ffprobe:分析工具,查看媒体文件的详细信息
我个人习惯把这三个工具都装上,因为工作中几乎都会用到。
核心提示:FFmpeg 本身是命令行工具,没有图形界面。别怕,命令行反而更高效。你想想看,一条命令就能批量处理几百个文件,GUI 工具能做到吗?
安装与配置
不同操作系统安装方式不太一样。我分别说一下。
Windows 安装
- 去 FFmpeg 官网下载 Windows 构建版(我推荐 BtbN 的 builds)
- 解压到
C:\ffmpeg目录 - 把
C:\ffmpeg\bin添加到系统环境变量 PATH 中 - 打开 cmd,输入
ffmpeg -version验证
小技巧:我习惯把 FFmpeg 放在 C:\tools\ffmpeg 下,这样方便统一管理。另外,记得把 ffplay.exe 和 ffprobe.exe 也放在同一个 bin 目录里。
macOS 安装
用 Homebrew 最省事:
brew install ffmpeg
这条命令会自动安装 FFmpeg 以及大部分常用编码器。我曾经踩过一个坑——默认安装可能不带 libx264,需要加参数:
brew install ffmpeg --with-x264
不过现在新版 Homebrew 默认已经包含了,你可以装完后用 ffmpeg -encoders | grep x264 确认一下。
Linux 安装
Ubuntu/Debian 系:
sudo apt update
sudo apt install ffmpeg
CentOS/RHEL 系:
sudo yum install epel-release
sudo yum install ffmpeg ffmpeg-devel
注意:Linux 下如果遇到「libx264 not found」的错误,说明系统没有安装 x264 编码器。你需要先编译安装 x264,或者启用第三方仓库(如 RPM Fusion)。我曾经在 CentOS 7 上折腾了一下午才搞定,后来干脆用 Docker 了。
验证安装
装完之后,跑一下这条命令:
ffmpeg -version
你会看到类似这样的输出:
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-nonfree ...
libavutil 58. 2.100 / 58. 2.100
libavcodec 60. 3.100 / 60. 3.100
libavformat 60. 3.100 / 60. 3.100
libavdevice 60. 1.100 / 60. 1.100
libavfilter 9. 3.100 / 9. 3.100
libswscale 7. 1.100 / 7. 1.100
libswresample 4. 10.100 / 4. 10.100
libpostproc 57. 1.100 / 57. 1.100
看到这些库版本号,说明安装成功了。注意看 configuration 那一行,里面列出了启用的功能模块。如果缺少某些编码器,后面转码时会报错。
常用命令行工具
FFmpeg 的命令行参数非常多,但常用的其实就十几个。我按使用频率给你列一下。
ffmpeg 基本语法
ffmpeg [全局参数] [输入文件参数] -i 输入文件 [输出文件参数] 输出文件
举个例子:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
这条命令把 input.mp4 转码为 H.264 视频 + AAC 音频。参数说明:
-c:v libx264:视频编码器用 libx264-c:a aac:音频编码器用 AAC
常用操作速查表
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 格式转换 | ffmpeg -i input.avi output.mp4 |
自动选择编码器 |
| 提取音频 | ffmpeg -i input.mp4 -vn -c:a copy output.aac |
-vn 表示不要视频 |
| 截取片段 | ffmpeg -i input.mp4 -ss 00:01:00 -t 30 output.mp4 |
从第1分钟开始,截取30秒 |
| 调整分辨率 | ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4 |
缩放到720p |
| 合并视频 | ffmpeg -f concat -i filelist.txt -c copy output.mp4 |
需要先创建文件列表 |
| 推流到RTMP | ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream |
-re 表示按原速读取 |
我的经验:刚开始用 FFmpeg 时,别急着背参数。记住 -i(输入)、-c(编码器)、-vf(视频滤镜)、-af(音频滤镜)这四个就够了。其他参数用到时再查文档,慢慢就熟了。
音视频文件信息查看
这是 ffprobe 的强项。我几乎每天都会用它来检查文件。
快速查看基本信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
输出 JSON 格式的信息,包含:
- 文件格式、时长、比特率
- 视频流:编码器、分辨率、帧率、像素格式
- 音频流:编码器、采样率、声道数、比特率
如果你只想看人类可读的版本:
ffprobe -v quiet -show_format -show_streams input.mp4
只看视频流信息
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate input.mp4
只看音频流信息
ffprobe -v quiet -select_streams a:0 -show_entries stream=codec_name,sample_rate,channels,bit_rate input.mp4
避坑指南:我曾经遇到一个视频,ffprobe 显示时长是 10 分钟,但实际播放到 8 分钟就结束了。原因是文件头里的 duration 字段写错了。遇到这种情况,可以用 -show_packets 参数查看实际数据包的时间戳,那才是真实时长。
本章知识体系
下面这张图帮你理清 FFmpeg 入门阶段的核心脉络:
避坑指南与个人经验
最后分享几个我踩过的坑,希望能帮你省点时间。
- 路径问题:Windows 下如果路径包含中文或空格,记得用双引号包起来。比如
ffmpeg -i "C:\我的视频\test.mp4"。我曾经因为没加引号,排查了半天。 - 编码器缺失:转码时如果报
Unknown encoder 'libx264',说明你的 FFmpeg 没有编译 x264 支持。重新安装带--enable-gpl --enable-libx264的版本。 - 推流卡顿:用
-re参数按原速读取文件,否则 FFmpeg 会以最快速度推流,导致服务器压力过大。我刚开始做直播时没加这个参数,结果服务器直接挂了。 - ffprobe 显示不完整:有些封装格式(如 FLV)的元数据可能不完整。用
-analyzeduration 100M -probesize 100M增加分析时长和探测大小,能获取更准确的信息。
嗯,FFmpeg 入门其实不难。装好环境,跑通几个命令,你就能感受到它的强大。后面章节我们会深入具体的转码参数、滤镜、封装格式,一步步把多媒体流系统搭建起来。