1. WebRTC编码参数概述
做WebRTC开发这些年,我经常被问到同一个问题:“为什么我的视频通话这么卡?”
很多人第一反应是网络不好。但说实话,大部分时候问题出在编码参数上。参数没调对,再好的网络也白搭。
这一章,我们先搞清楚编码参数到底是什么,为什么要调它,以及有哪些核心参数需要关注。
1.1 什么是编码参数
编码参数,说白了就是告诉编码器“怎么压缩视频”的一组指令。
视频原始数据有多大?举个简单的例子:
- 720p分辨率,30帧,每帧约1.2MB
- 一秒钟就是36MB
- 一分钟超过2GB
不压缩根本没法传。编码器就是干这个的——把原始数据压缩成码流。而编码参数,就是控制压缩行为的开关和旋钮。
核心理解:编码参数 = 编码器的配置清单。它决定了画质、码率、延迟、计算开销之间的平衡点。
我在项目中遇到过一位同事,死活搞不定视频卡顿。后来发现他把码率上限设成了10Mbps,但用户手机只有4G信号。参数设得再高,网络扛不住也是白费。
1.2 为什么需要调优
WebRTC默认参数能跑,但跑不好。原因有三:
- 场景不同——视频会议、远程医疗、直播推流,对画质和延迟的要求天差地别
- 网络多变——WiFi切4G、丢包、抖动,默认参数不会自动适应
- 设备差异——旗舰机和千元机的编码能力完全不同
我曾经接手过一个远程问诊项目。默认参数下,医生端画面延迟超过2秒。患者说“我头晕”,医生5秒后才回应。这种体验谁敢用?后来我们把编码参数调了一遍,延迟降到200ms以内。
我的经验:调优不是炫技,是刚需。不调参数的产品,上线就是事故。
1.3 核心参数一览
WebRTC编码参数很多,但真正需要你关注的,其实就这几类:
| 参数类别 | 核心参数 | 一句话说明 |
|---|---|---|
| 码率控制 | minBitrate / maxBitrate / targetBitrate | 限制编码器能用的带宽上限和下限 |
| 分辨率 | width / height / scaleResolutionDownBy | 决定画面大小,直接影响码率消耗 |
| 帧率 | maxFramerate | 每秒多少帧,影响流畅度 |
| 编码器选择 | codec: 'VP8' / 'VP9' / 'H264' / 'AV1' | 不同编码器压缩效率和兼容性不同 |
| 关键帧间隔 | keyFrameInterval | 多久生成一个完整帧,影响随机寻址和抗丢包 |
| 编码复杂度 | complexity: 'low' / 'medium' / 'high' | 编码器花多少力气压缩,影响CPU和画质 |
注意:这些参数不是独立存在的。调分辨率会影响码率,调码率会影响帧率。牵一发而动全身。
1.4 参数之间的联动关系
很多人以为参数是独立调节的。其实它们之间是互相制约的关系。
举个例子:
- 你把分辨率从720p降到480p,码率消耗自然下降
- 但如果你同时把码率上限设得很高,编码器会浪费带宽去传冗余信息
- 反过来,分辨率高但码率低,画面就会糊成一团
我习惯用一个简单的公式来理解:
画质 ≈ 码率 / (分辨率 × 帧率)
这个公式不精确,但能帮你快速判断:码率不够的时候,降分辨率比降帧率更有效。
下面这张图展示了核心参数之间的依赖关系:
1.5 调优的基本思路
说了这么多,到底怎么调?我总结了一个三步法:
- 明确目标——你要低延迟还是高画质?两者不可兼得
- 摸清底线——网络最低多少?设备最差是什么?
- 逐步逼近——先调码率,再调分辨率,最后微帧率
一个小技巧:调参时一次只改一个变量。同时改三个参数,出了问题你根本不知道是谁的锅。我吃过这个亏,调试了整整两天才发现是帧率设太高了。
嗯,这一章就到这里。编码参数的概念和核心参数已经讲清楚了。后面的章节,我们会逐个深入每个参数的具体用法和调优技巧。