RtcEventLog · 通话的黑匣子
RtcEventLog 是 WebRTC 的黑匣子——把通话期间每个关键事件(RTP 头、RTCP、ICE、带宽估计变化)逐条记进一个二进制日志,事后能完整回放。这一章读 rtc_event_log.h,讲清它记什么、怎么开关、二进制格式为何不该当 protobuf 直接读。
RtcEventLog · 通话的黑匣子
getStats 是“快照”,回答“现在怎么样”。但要查“第 30 秒为什么开始卡”这类时序问题,快照不够——你需要一份“录像”。这就是 RtcEventLog:WebRTC 的黑匣子,把通话期间发生的一切逐条记下来。
接口:开、关、记
RtcEventLog 的接口极简(真实源码 rtc_event_log/rtc_event_log.h):
// rtc_event_log/rtc_event_log.h(节选,真实源码)
class RtcEventLog {
public:
enum class EncodingType { Legacy, NewFormat, ProtoFree };
virtual bool StartLogging(std::unique_ptr<RtcEventLogOutput> output,
int64_t output_period_ms) = 0;
virtual void StopLogging() = 0;
virtual void Log(std::unique_ptr<RtcEvent> event) = 0; // 记一个事件
};
// 关闭日志时用的空实现,什么都不记(零开销)
class RtcEventLogNull final : public RtcEventLog {
void Log(std::unique_ptr<RtcEvent> /*event*/) override {}
};记什么:几乎所有关键事件
RtcEventLog 记录的内容,官方 g3doc 列得很清楚——覆盖了排障需要的几乎所有维度:
| 记录的事件 | 对应本教程 |
|---|---|
| 收 / 发的 RTP 头(不含负载) | 第 4 部分 RTP |
| 完整的 RTCP 反馈 | RTCP 反馈 |
| ICE candidate、ping、response | 连通性检查 |
| 带宽估计事件(loss/delay-based 估计、探测结果、ALR 状态) | 第 5 部分拥塞控制 |
| 音频网络自适应设置 | 音频编解码 |
| 音频播放事件 | NetEq |
注意:RTP 只记头、不记负载——日志是为排障**,不是录音录像。** 记 RTP 头(序号、时间戳、SSRC、扩展)就够重建“包何时发 / 到、丢了没、乱序没”;记负载则既是隐私风险、又让日志大到没法用。这个“记元数据、不记内容”的取舍,让 event log 足够小、又足够还原网络行为。尤其宝贵的是它记了带宽估计的内部事件——GoogCC 每次改主意、每次探测都留痕,这是从外部永远看不到的引擎内心活动,也是调“为什么码率上不去”的关键证据。
二进制格式:别当 protobuf 直接读
一个容易踩的坑(g3doc 特别强调):
event log 是二进制格式**,且“不保证格式稳定、可能随时变”——你不应该把它当 protobuf 直接解析,而要用官方的 rtc_event_log_parser.h 来读。** 为什么?日志格式为了省空间一直在演进(EncodingType 那几种就是证据),内部虽然用了 protobuf-like 编码,但布局细节属于实现私货。直接按 protobuf 解会在下个版本挂掉;而官方 parser 会兼容新旧格式。这个约束提醒我们:event log 是给官方工具链吃的中间产物,不是稳定的对外 API——你的角色是“抓日志 + 用官方工具分析”,而非自己解析二进制。
日志一般输出到文件(RtcEventLogOutputFile),Chrome 里可通过 chrome://webrtc-internals 一键 dump。抓到的 .log 文件,交给下一章的可视化工具。
小结与下一章
RtcEventLog 是 WebRTC 的黑匣子——StartLogging/StopLogging/Log(event) 把通话期间的每个关键事件逐条记下。日志关闭时用 RtcEventLogNull 空实现做到零开销,开启时批量落盘。它记RTP 头(不记负载,兼顾隐私与体积)、RTCP、ICE 事件、以及最宝贵的带宽估计内部事件——外部看不到的引擎内心活动。格式是会变的二进制,须用官方 parser 读、别当 protobuf 直接解。
抓到日志后,怎么把它变成能看懂的图、定位问题?下一章看可视化工具与排障实战。👉 可视化与排障。
参考资料
- [1] libwebrtc 源码.
rtc_event_log/rtc_event_log.h(StartLogging/Log/EncodingType、RtcEventLogNull)、rtc_event_log_output_file.h。 - [2] WebRTC 官方
g3doc/rtc_event_log.md(记录内容清单、格式说明)。 - [3] 关联第 4 部分 RTP/RTCP、第 5 部分拥塞控制。