WebRTC源码分析——RtcEventLog事件日志模块

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功能的分析

3. RtcEventLog对象——RtcEventLogImpl

4. 总结

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值