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 推流帧率:真正的输出

推流帧率是编码器实际输出并发送到网络的帧率。它受采集帧率、编码性能、网络带宽三方面制约。

为什么会这样?因为推流链路是这样的:

  1. 采集:摄像头/屏幕捕获 → 原始帧率(如 60 FPS)
  2. 预处理:缩放、滤镜、裁剪 → 可能丢帧
  3. 编码:CPU/GPU 编码 → 如果性能不够,帧率会下降
  4. 发送:网络传输 → 带宽不足时,编码器会降帧

所以,你设的采集帧率只是期望值,实际推流帧率才是真实值。

避坑指南:我曾经在一个项目中,采集端设了 60 FPS,但编码器是软编,CPU 跑满也只能编 35 FPS。结果推流帧率忽高忽低,观众端卡成幻灯片。后来我把采集帧率降到 30,编码器反而稳定输出了 30 FPS,体验好了很多。

1.5 四者关系:一张图说清楚

下面这张图展示了 FPS、帧间隔、刷新率、推流帧率之间的核心关系:

帧率核心概念关系图 帧率核心概念关系图 FPS 每秒帧数 帧间隔 1000 / FPS (ms) 刷新率 显示器 Hz 推流帧率 实际编码输出帧率 决定 匹配 上限约束 决定延迟下限 目标适配 💡 关键理解: 推流帧率 ≤ 采集 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 是采集端的能力上限
  • 帧间隔 决定了延迟的理论下限
  • 刷新率 是观众端的显示节奏
  • 推流帧率 才是最终用户感受到的流畅度