2. 网络带宽不足:带宽概念、上行带宽不足的表现、如何测试上行带宽

说到推流卡顿,十次里有七八次都跟带宽有关。我刚开始做直播那会儿,总觉得编码参数调好了就万事大吉,结果上线第一天就被用户骂到怀疑人生。后来才明白——你本地编码再漂亮,网络这个水管不够粗,数据一样送不出去。

这一节我们就来聊聊带宽,尤其是上行带宽。说白了,推流就是你的机器不停地往服务器发数据,上行带宽决定了你每秒能发出去多少东西。

2.1 带宽到底是什么?

带宽不是「网速」,它更像一根水管的粗细。水管越粗,单位时间内能流过的水就越多。带宽的单位是 bps(bit per second),也就是每秒能传输多少比特。

这里有个常见的坑——大B和小b。运营商说的 100M 宽带,其实是 100 Mbps(兆比特每秒)。而我们推流时设置的码率,比如 5000 kbps,也是千比特每秒。换算成你平时下载文件看到的 MB/s,要除以 8:

100 Mbps ÷ 8 = 12.5 MB/s

嗯,这个换算一定要刻在脑子里。我见过不止一个同事,拿着 100M 的宽带觉得推 10 Mbps 的流绰绰有余,结果卡成幻灯片——因为他忘了上行和下行是两回事。

核心概念速记:

  • 下行带宽:你从互联网下载数据的速度。看视频、刷网页用的就是它。
  • 上行带宽:你往互联网发送数据的速度。推流、上传文件、视频通话用的就是它。
  • 运营商通常只保证下行,上行往往只有下行的 1/10 甚至更少。

2.2 上行带宽不足的表现

上行带宽不够,推流端会有什么症状?我总结了几条,你可以在自己的推流日志里对照着看:

表现 具体现象 严重程度
推流端上传抖动 OBS 或编码器面板上的「上传速率」曲线频繁掉到 0 ⚠️ 常见
编码器丢帧 日志中出现大量 "dropped frames due to network" ⚠️ 常见
推流端 CPU 正常但画面卡 编码器没满载,但推出去的画面一帧一帧地跳 ⚠️ 常见
观众端频繁缓冲 播放器一直在转圈,或者画面突然变模糊后又恢复 🔴 严重
推流端 RTMP 断连 日志报 "Failed to connect to RTMP server" 或 "Connection timed out" 🔴 严重

我曾经在一个户外直播项目里遇到过这种情况:现场 4G 信号满格,但推流就是每隔 30 秒卡一次。后来一测上行,实际可用带宽只有 1.2 Mbps,而我们的推流码率设了 3 Mbps。你说能不卡吗?

避坑指南: 不要只看「信号格数」。4G/5G 信号满格只代表你离基站近,不代表基站给你分配了足够的上行资源。尤其是在演唱会、体育场这种人多的场景,基站的上行资源会被大量用户共享,实际可用带宽可能只有理论值的十分之一。

2.3 如何测试上行带宽?

测试上行带宽,我建议分三步走。别只信一个工具的结果,多角度验证才靠谱。

2.3.1 方法一:Speedtest 类工具(快速摸底)

打开 speedtest.net 或 fast.com,选一个离你推流服务器最近的节点。注意看 Upload 那一项。

但这里有个问题——Speedtest 测的是「尽力而为」的带宽,它会用多线程、大包去压满你的线路。而推流是单线程、持续小包的传输模式。所以 Speedtest 的结果往往比实际推流可用带宽 高 20%~50%。

我的习惯: Speedtest 测出来上行是 10 Mbps,那我推流码率就只设 6~7 Mbps,留 30% 的余量。别贪,贪了必卡。

2.3.2 方法二:iPerf3 测试(精准测量)

如果你有服务器权限,iPerf3 是最准的。它模拟的就是真实的 TCP/UDP 数据传输场景。

在服务器端启动:

iperf3 -s

在推流端启动:

iperf3 -c 你的服务器IP -t 30 -i 1 -P 1

参数说明:

  • -t 30:测试 30 秒,别太短,10 秒以内的测试波动太大
  • -i 1:每秒输出一次结果,方便看稳定性
  • -P 1:单线程,模拟推流的真实场景

看输出里的 Sender 那一行的带宽值。如果这个值波动超过 20%,说明你的上行线路不稳定,即使平均值够高,推流也可能会间歇性卡顿。

2.3.3 方法三:真实推流测试(最可靠)

工具测完,最后一步永远是拿真实推流跑一遍。我建议这样做:

  1. 用 OBS 或 FFmpeg 推一个固定画面的测试流(比如一张静态图 + 静音音频)
  2. 码率设为你目标码率的 80%
  3. 推 5 分钟,观察 OBS 面板的「丢帧率」和「上传速率」曲线
  4. 如果丢帧率 < 0.1%,且上传速率曲线平稳,说明带宽够用
  5. 如果丢帧率 > 1%,或者曲线频繁掉到 0,说明带宽不足,需要降码率

一句话总结: 上行带宽不足,最直接的解法就是降码率。从 8 Mbps 降到 6 Mbps,从 6 Mbps 降到 4 Mbps,直到丢帧率归零。别觉得降码率就是降画质——稳定流畅的 4 Mbps 比卡成狗的 8 Mbps 体验好一百倍。

2.4 带宽与推流参数的关系图

下面这张图帮你理清带宽、码率、分辨率、帧率之间的关系。我每次给团队新人培训都会画一遍:

带宽与推流参数关系图 带宽与推流参数关系图 上行带宽 (Mbps) 影响因素 网络类型 线路负载 距离/跳数 决定参数 视频码率 分辨率 帧率 经验公式 推流码率 ≤ 上行带宽 × 0.7(留 30% 余量) 1080p 60fps → 建议 6~8 Mbps 720p 30fps → 建议 2.5~4 Mbps

这张图想表达的核心逻辑很简单:上行带宽是天花板。你的码率、分辨率、帧率这三项加起来的总数据量,绝对不能超过这个天花板。超过一点,卡顿;超过太多,断流。

我个人习惯在项目初期就先跑一遍 iPerf3 测试,拿到真实上行带宽后,再反推编码参数。这样后面出问题的概率会小很多。嗯,说白了就是——别等用户骂了才想起来测带宽,提前测好,省心省力。