1. 帧率基础概念:理解 FPS、帧间隔、刷新率与推流帧率的关系
做推流开发这些年,我见过太多人一上来就调编码参数、改码率,结果画面还是卡顿。其实根子往往没搞清楚——帧率这个基础概念没吃透。今天咱们就把这几个绕不开的概念掰扯清楚。
1.1 FPS:每秒多少帧?
FPS(Frames Per Second),说白了就是每秒钟画面更新了多少次。30 FPS 就是一秒闪过 30 张图,60 FPS 就是 60 张。
人眼对 24 FPS 以上就觉得流畅了。但推流不一样——你想想看,网络传输有抖动、编码有延迟,实际到观众端的帧率往往比采集端低不少。
核心公式:
帧间隔(ms) = 1000 / FPS
30 FPS → 每帧间隔 ≈ 33.3ms
60 FPS → 每帧间隔 ≈ 16.7ms
我在项目中遇到过,有人把采集帧率设成 60,但编码器根本跑不动,结果实际输出只有 20 多帧。嗯,这里要注意:采集帧率 ≠ 推流帧率。
1.2 帧间隔:决定延迟的关键
帧间隔就是两帧之间的时间差。它直接决定了端到端延迟的下限。
举个例子:你采集 30 FPS,帧间隔 33ms。就算网络零延迟,观众至少也要等 33ms 才能看到下一帧。如果中间有 B 帧、P 帧的依赖关系,延迟还会更大。
| 目标 FPS | 帧间隔 | 理论最低延迟 | 常见场景 |
|---|---|---|---|
| 15 | 66.7ms | ~67ms | 低码率直播、监控 |
| 24 | 41.7ms | ~42ms | 电影、影视推流 |
| 30 | 33.3ms | ~33ms | 通用直播、视频会议 |
| 60 | 16.7ms | ~17ms | 游戏推流、高帧率直播 |
我的习惯:做低延迟推流时,我一般先算帧间隔,再反推编码缓存和网络缓冲的大小。帧间隔越短,缓冲就得越小,否则延迟就上去了。
1.3 刷新率:显示器的节奏
刷新率是显示器每秒刷新画面的次数,单位也是 Hz。常见的有 60Hz、120Hz、144Hz。
刷新率和 FPS 的关系,我打个比方:FPS 是水龙头出水的速度,刷新率是杯子接水的频率。水出得再快,杯子接不过来也是白搭。
- FPS > 刷新率:多余帧被丢弃,画面撕裂(tearing)
- FPS < 刷新率:显示器重复显示同一帧,感觉卡顿
- FPS = 刷新率:最理想,每帧都能被及时显示
我曾经调试一个游戏推流项目,采集端跑 120 FPS,但观众显示器只有 60Hz。结果观众端画面撕裂严重。后来我强制推流端输出 60 FPS,问题就解决了。
注意:推流时不要盲目追求高 FPS。如果观众端设备跟不上,高 FPS 反而会浪费带宽、增加延迟。我建议根据目标用户的主流设备刷新率来设定推流帧率。
1.4 推流帧率:真正的输出
推流帧率是编码器实际输出并发送到网络的帧率。它受采集帧率、编码性能、网络带宽三方面制约。
为什么会这样?因为推流链路是这样的:
- 采集:摄像头/屏幕捕获 → 原始帧率(如 60 FPS)
- 预处理:缩放、滤镜、裁剪 → 可能丢帧
- 编码:CPU/GPU 编码 → 如果性能不够,帧率会下降
- 发送:网络传输 → 带宽不足时,编码器会降帧
所以,你设的采集帧率只是期望值,实际推流帧率才是真实值。
避坑指南:我曾经在一个项目中,采集端设了 60 FPS,但编码器是软编,CPU 跑满也只能编 35 FPS。结果推流帧率忽高忽低,观众端卡成幻灯片。后来我把采集帧率降到 30,编码器反而稳定输出了 30 FPS,体验好了很多。
1.5 四者关系:一张图说清楚
下面这张图展示了 FPS、帧间隔、刷新率、推流帧率之间的核心关系:
1.6 实际推流中的帧率选择策略
根据我多年的经验,不同场景的帧率选择可以参考这个表:
| 场景 | 推荐推流帧率 | 原因 |
|---|---|---|
| 语音/PPT 直播 | 15 FPS | 画面变化少,低帧率省带宽 |
| 普通视频直播 | 24-30 FPS | 人眼舒适区,兼容性好 |
| 游戏推流(非竞技) | 30 FPS | 平衡画质与流畅度 |
| 竞技游戏推流 | 48-60 FPS | 高帧率减少操作延迟感 |
| VR/AR 推流 | 60-90 FPS | 低帧率会导致眩晕 |
我的建议:如果你不确定选多少,先设 30 FPS。这是最通用的折中方案。等上线后看监控数据——如果编码器丢帧率超过 5%,就降一档;如果观众反馈卡顿,检查网络带宽是否够用。
1.7 本章小结
帧率不是越高越好。你得理解:
- FPS 是采集端的能力上限
- 帧间隔 决定了延迟的理论下限
- 刷新率 是观众端的显示节奏
- 推流帧率 才是最终用户感受到的流畅度