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。

注意:有些编码器(比如libaom-av1)编译特别慢,第一次编译建议只开你需要的。我曾经为了等AV1编译完成,去泡了杯咖啡,回来发现还在编译……又泡了一杯。

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 编码器选型决策逻辑

选编码器不是拍脑袋,我一般按这个流程走:

  1. 先看终端设备:如果用户全是手机和电脑,H.265没问题。如果有老电视、机顶盒,老老实实H.264。
  2. 再看带宽成本:带宽贵就上AV1或VP9,带宽便宜就H.264。
  3. 最后看编码时效:直播必须H.264,点播可以H.265,存档才考虑AV1。

说白了,没有最好的编码器,只有最合适的。

下面这张图是我自己总结的选型逻辑,你可以参考:

编码器选型决策流程 输入视频源 终端设备兼容性要求? H.264 (libx264) 带宽/存储成本敏感? AV1 (libaom-av1) H.265 (libx265) VP9 (libvpx-vp9) 选型原则 直播/实时场景 → H.264 点播/存储 → H.265 或 VP9 极致压缩/存档 → 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。但今天这些基础,是后面所有操作的前提。