1. 课程导入
1.1 什么是转码管线?
转码管线,说白了就是一条「加工流水线」。
你拿来一个视频文件,可能是手机拍的 H.264,也可能是摄像机录的 ProRes。你想把它变成适合网络分发的 H.265,或者变成老设备能播的 MPEG-2。这个过程不是一步到位的——它需要拆包、解码、处理、编码、再封装。这一整套工序串起来,就是转码管线。
我刚开始做转码时,以为就是调个 FFmpeg 命令那么简单。后来发现,一条命令背后藏着几十个环节,任何一个环节卡住,整个管线就慢了。你想想看,一个 4K 视频,如果解码器没选对,CPU 跑满也干不过 GPU 的十分之一。这就是管线的意义——把每个环节拆开,找到瓶颈,再优化。
1.2 转码管线的核心组件
一条完整的转码管线,通常包含五个核心组件。我习惯把它们分成「前处理」「核心处理」「后处理」三段来看。
| 阶段 | 组件 | 职责 | 常见工具/库 |
|---|---|---|---|
| 前处理 | 解封装器(Demuxer) | 读取容器格式,分离音视频流 | FFmpeg libavformat, MP4Box |
| 前处理 | 解码器(Decoder) | 将压缩码流解码为原始帧 | libavcodec, NVENC, VAAPI |
| 核心处理 | 滤镜/处理模块(Filter) | 缩放、去噪、字幕叠加、帧率转换 | FFmpeg filters, OpenCV, Vulkan |
| 后处理 | 编码器(Encoder) | 将原始帧压缩为目标格式 | x264, x265, NVENC, QSV |
| 后处理 | 封装器(Muxer) | 将编码后的流写入目标容器 | libavformat, GPAC |
嗯,这里要注意——很多人以为编码器就是全部。其实解码器和滤镜往往才是真正的性能杀手。我在项目中遇到过,一个 8K 视频的解码带宽能吃掉整个 PCIe 通道,导致 GPU 编码器饿着肚子等数据。所以,别只盯着编码器调参。
1.3 性能调优的重要性
为什么要调优?直接上默认参数不行吗?
行,但你会亏钱。
我举个例子。有一次给客户做直播转码,原始配置用了软件解码 + 软件编码,CPU 跑到 95%,单路 1080p 延迟 3 秒。客户说不行,要 10 路并发。我一算,得加 10 台服务器。后来换成硬件解码 + 硬件编码,同样一台机器,10 路并发,CPU 只用了 40%,延迟降到 500 毫秒。你想想看,这中间差了多少成本?
性能调优的核心目标就三个:
- 吞吐量——单位时间内能处理多少路流
- 延迟——从输入到输出需要多久
- 资源效率——CPU、GPU、内存、带宽用得好不好
这三者经常互相制约。调高了吞吐量,延迟可能就上去了。省了内存,CPU 可能就忙了。这就是调优的乐趣所在——找到那个平衡点。
1.4 转码管线的典型流程
下面这张图,是我自己画的一条典型转码管线。你可以看到数据是怎么一步步流过去的。
你看,数据从左边进来,经过解封装、解码、滤镜、编码、封装,最后从右边出去。每一步都可能成为瓶颈。我见过最离谱的一次,滤镜里加了一个「去闪烁」算法,单帧处理时间从 2 毫秒飙到 200 毫秒——整个管线直接废了。
1.5 调优的切入点
知道了管线长什么样,接下来就是找地方下手。我个人习惯按这个顺序排查:
- 先看解码——是不是用了硬件解码?码流是不是太高?
- 再看滤镜——能不能合并?能不能用 GPU 加速?
- 然后看编码——preset 是不是太慢?码率控制模式对不对?
- 最后看 I/O——磁盘读写是不是瓶颈?网络传输够不够快?
ffmpeg -benchmark 跑了一遍,发现解码器才是瓶颈。所以,先测量,再动手。别做「感觉调优」。
好了,这一章我们先把管线的概念和组件理清楚。后面的章节,我会带你一步步深入每个环节,从解码器选型到编码器调参,从 GPU 加速到内存优化,把整条管线从头到尾调一遍。