目录
1. 引言
从RtcEventLog的名称粗略看来是WebRTC中的事件日志系统,具体是做什么,如何做的,当前还未看全源码,所以不便下结论。比较确定的是RtcEventLog和WebRTC中RTC_LOG宏所输出的日志是不相干的两个系统。
主要的源码分布在api目录下,提供了接口类:
以及logging目录下,提供了具体的实现:
2. RtcEventLogFactory && RtcEventLog对象的创建
RtcEventLogFactory是事件日志对象的工厂类,负责RtcEventLog对象的创建,而RtcEventLog对象负责将Rtc事件写入到RtcEventLogOutput代表的日志文件或者其他输入设备中。
想要清楚的知道创建的RtcEventLog的实体类对象是什么,它具体的工作原理,那么需要追根究底的知道RtcEventLogFactory对象是何时,如何被创建的,什么时候被用来创建RtcEventLog的实体对象。
2.1 RtcEventLogFactory对象的创建
RtcEventLogFactory对象是一个WebRTC内部的实体对象,API层对象的接口是RtcEventLogFactoryInterface。
RtcEventLogFactory对象在WebRTC创建PeerConnectionFactory,调用的CreatePeerConnectionFactory方法中被创建出来并被PeerConnectionFactory持有。 注意,RtcEventLogFactory依赖的TaskQueueFactory也在该方法中被创建。
rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory() {
...
dependencies.task_queue_factory = CreateDefaultTaskQueueFactory();
dependencies.event_log_factory = std::make_unique<RtcEventLogFactory>(
dependencies.task_queue_factory.get());
...
}
2.2 RtcEventLog对象的创建
RtcEventLog类是一个接口类,虽然名称上没有冠以接口。在调用PeerConnectionFactory.CreatePeerConnection() 方法创建PeerConnection时,该方法内部会调用PeerConnectionFactory.CreateRtcEventLog_w() 方法创建出RtcEventLog的实体对象。
std::unique_ptr<RtcEventLog> PeerConnectionFactory::CreateRtcEventLog_w() {
// 方法只能在工作者线程调用
RTC_DCHECK_RUN_ON(worker_thread_);
// 判断事件日志的编码类型
auto encoding_type = RtcEventLog::EncodingType::Legacy;
if (IsTrialEnabled("WebRTC-RtcEventLogNewFormat"))
encoding_type = RtcEventLog::EncodingType::NewFormat;
// 创建Rtc事件日志对象
return event_log_factory_
? event_log_factory_->CreateRtcEventLog(encoding_type)
: std::make_unique<RtcEventLogNull>();
}
首先:事件日志是否采样新编码格式,取决于应用的入参是否开启了这个新特性,即应用程序的命令行入参中是否对“WebRTC-RtcEventLogNewFormat”进行了设置。
其次:根据之前的分析event_log_factory_是存在的,并且为RtcEventLogFactory对象,因此,RtcEventLogFactory.CreateRtcEventLog()将用来创建RtcEventLog接口对应的实体对象。
RtcEventLogNull类根据其名字就可以知道,它实现了RtcEventLog所有公有方法,但是这些方法中什么实际动作都没有。
2.2.1 RtcEventLogFactory.CreateRtcEventLog
RtcEventLogFactory.CreateRtcEventLog() 方法源码如下,可知实际上创建的RtcEventLog实体类为RtcEventLogImpl。
std::unique_ptr<RtcEventLog> RtcEventLogFactory::CreateRtcEventLog(
RtcEventLog::EncodingType encoding_type) {
#ifdef WEBRTC_ENABLE_RTC_EVENT_LOG
return std::make_unique<RtcEventLogImpl>(encoding_type, task_queue_factory_);
#else
return std::make_unique<RtcEventLogNull>();
#endif
}
该对象创建后,会被PeerConnection持有,PeerConnection对应用层提供了开启、关闭事件日志,记录日志操作接口,这些功能就是调用RtcEventLogImpl对象的相应方法实现的。具体可以往下看对RtcEventLogImpl功能的分析