1. FFmpeg基础与编码器选择
做视频编码的人,没人能绕过FFmpeg。我入行那会儿,第一次接触FFmpeg是在一个流媒体项目里,领导丢给我一句「把H.264转成H.265,码率压到一半」。我当时连FFmpeg怎么装都不知道,硬着头皮啃了三天文档。现在回头看,编码器选型这件事,确实是整个码率控制的地基。
这一章,咱们先把地基打牢。
1.1 FFmpeg是什么?
FFmpeg不是编码器,它是一个多媒体处理框架。说白了,它是一套工具集,能解封装、解码、滤镜处理、编码、再封装。你给它一个输入文件,它就能按你的要求输出任何格式。
它的核心组件就这几个:
- libavformat:处理封装格式,比如MP4、MKV、FLV
- libavcodec:编解码核心,所有编码器都挂在这里
- libavfilter:滤镜引擎,缩放、裁剪、调色都靠它
- libswscale:像素格式转换和缩放
- ffmpeg命令行工具:我们日常用的那个
我个人习惯把FFmpeg比作「瑞士军刀」。你不需要每次都拆开所有零件,但得知道哪个零件在哪儿。
1.2 编译安装:别怕,没那么玄乎
很多人一听到「编译安装」就头疼。其实编译FFmpeg没那么复杂,尤其是现在有脚本工具了。但我还是建议你手动编译一次,因为只有自己编译过,你才知道哪些编码器被打开了,哪些没开。
我在项目中遇到过最坑的事:生产服务器上用的FFmpeg是apt装的,没有libx264,也没有libx265。结果转码任务跑了一半,报错说编码器找不到。嗯,从那以后,我所有服务器都自己编译。
下面是我常用的编译流程:
# 安装依赖
sudo apt update
sudo apt install -y \
autoconf automake build-essential cmake git \
libass-dev libfreetype6-dev libsdl2-dev \
libtool libva-dev libvdpau-dev libvorbis-dev \
libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \
pkg-config texinfo wget zlib1g-dev \
nasm yasm libx264-dev libx265-dev \
libvpx-dev libaom-dev
# 下载源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
# 配置
./configure \
--enable-gpl \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libaom \
--enable-libass \
--enable-libfreetype \
--enable-nonfree
# 编译(4核并行)
make -j4
# 安装
sudo make install
--prefix=/opt/ffmpeg 就能装到指定目录,不影响系统自带的FFmpeg。
1.3 查看支持的编码器
编译完了,第一件事就是看看你的FFmpeg到底支持哪些编码器。别信文档,信命令行。
# 查看所有编码器
ffmpeg -encoders
# 只看视频编码器
ffmpeg -encoders | grep -E "^\s+V"
# 查看某个编码器的详细参数
ffmpeg -h encoder=libx264
输出里你会看到类似这样的信息:
Encoders:
V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
V..... libx265 libx265 H.265 / HEVC
V..... libvpx-vp9 VP9 (libvpx-vp9)
V..... libaom-av1 libaom AV1
V 开头的表示视频编码器。如果某个编码器没出现,那就是编译时没开对应的 --enable-libxxx。
1.4 四大编码器特性对比
咱们课程主要用四个编码器:libx264、libx265、libvpx-vp9、libaom-av1。它们各有各的脾气。
| 特性 | libx264 | libx265 | libvpx-vp9 | libaom-av1 |
|---|---|---|---|---|
| 编码标准 | H.264/AVC | H.265/HEVC | VP9 | AV1 |
| 压缩效率 | 基准 | 比H.264省30-50%码率 | 比H.264省40-50%码率 | 比H.264省50-60%码率 |
| 编码速度 | 极快 | 中等 | 慢 | 极慢 |
| 硬件加速 | 广泛支持 | 部分支持 | 有限 | 极少 |
| 码率控制模式 | CBR/VBR/CRF/CQP | CBR/VBR/CRF/CQP | CBR/VBR/CQ/CRF | CBR/VBR/CQ/CRF |
| 适用场景 | 直播、兼容性优先 | 高清存储、点播 | Web视频、开源项目 | 极致压缩、存档 |
你想想看,为什么H.264到现在还没被淘汰?因为兼容性。几乎所有设备都能硬解H.264,但H.265和AV1就不一定了。我在做OTT项目时,为了兼容老电视,主码流只能用H.264,辅码流才敢上H.265。
反过来,如果你做的是视频存档,码率就是钱。AV1虽然编码慢得像蜗牛,但省下来的存储成本,够你买好几台编码服务器了。
1.5 编码器选型决策逻辑
选编码器不是拍脑袋,我一般按这个流程走:
- 先看终端设备:如果用户全是手机和电脑,H.265没问题。如果有老电视、机顶盒,老老实实H.264。
- 再看带宽成本:带宽贵就上AV1或VP9,带宽便宜就H.264。
- 最后看编码时效:直播必须H.264,点播可以H.265,存档才考虑AV1。
说白了,没有最好的编码器,只有最合适的。
下面这张图是我自己总结的选型逻辑,你可以参考:
1.6 快速上手:第一个转码命令
光说不练假把式。装好了FFmpeg,咱们跑个最简单的转码:
# 用libx264编码,CRF 23,中等速度
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output_h264.mp4
# 用libx265编码,CRF 28,中等速度
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium output_h265.mp4
# 用libvpx-vp9编码,CRF 30,速度4
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -cpu-used 4 output_vp9.webm
# 用libaom-av1编码,CRF 35,速度2(很慢,耐心等)
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 35 -cpu-used 2 output_av1.mkv
关键点:
-crf是质量参数,值越小质量越高,文件越大。H.264一般18-28,H.265一般24-32,VP9和AV1一般30-40。-preset或-cpu-used控制编码速度。越慢质量越好,但耗时越长。- VP9的
-b:v 0是固定写法,表示启用CRF模式,不设目标码率。
我第一次跑AV1编码时,一个10分钟的1080p视频,用了将近两个小时。当时我还以为程序卡死了,差点按Ctrl+C。后来才知道,AV1就这脾气——慢,但省。
1.7 本章小结
这一章咱们把FFmpeg的底子摸了一遍。从编译安装到编码器查看,再到四大编码器的特性对比和选型逻辑。你记住一句话就行:编码器选型 = 终端兼容性 × 带宽成本 × 编码时效。
后面的章节,我们会深入每个编码器的码率控制参数,从CRF到CBR,从2-pass到VBV。但今天这些基础,是后面所有操作的前提。