webrtc源码分析-接口分析

本文详细分析了WebRTC的接口,包括CreatePeerConnectionFactory、CreatePeerConnection等,以及媒体引擎的创建。重点讲解了创建offer、处理SDP、添加远程ICE候选、本地ICE候选收集和P2P连接建立的过程。此外,还涵盖了音频数据流向、通道及流的创建流程。
摘要由CSDN通过智能技术生成

项目地址

主要api分析

CreatePeerConnectFactory and Media Engine

  • webrtc::CreatePeerConnectionFactory

    • 接口中需要传入一些线程对象和aodio以及video codec。
    • 其中线程对象会直接存放到PeerConnectionFactoryContext中。
    • codec、mixer、process会组装成mediaEngine待创建ChannelManager的时候交给其管理。
    • 通过CreateCallFactory会创建call_factory
    • 通过CreateModularPeerConnectionFactory创建最终的PeerConnectionFactory
  • CreateCallFactory

    • 创建CallFactory,只有一个接口,createCall。用于创建call,需要传入callConfig
  • call

    • //TODO
  • CreateMediaEngine

    • 创建WebRtcVoiceEngine,传入aduio codecs process mixer
    • 创建WebRtcVideoEngine,传入video codecs
    • 将创建的voiceEngine和VideoEngine交给CompositeMediaEngine,这个类没什么特别的。专门用来存放voice和video Engine的。
  • CreateModularPeerConnectionFactory

    • 如果执行create操作的不是signal线程,则交给signal线程执行。
    • 通过PeerConnectionFactory::Create()创建peecConnectionFactory
    • 将signal_thread、worker_thread、pc_factory交给PeerConnectionFactoryProxy管理。
  • PeerConnectionFactory::Create

    • 通过ConnectionContext::Create创建ConnectionContext。将CreatePeerConnectionFactory的所有参数交给ConnectionContext管理。
    • 将刚刚创建的context和CreatePeerConnectionFactory的参数交给PeerConnectionFactory实例。
    • 如果没有创建work_thread、network_thread、signaling_thread则在初始化ConnectionContex的时候创建,类型为thread。
  • ConnectionContext::Create

    • 启动network_thread_、worker_thread_、signaling_thread_
    • 通过cricket::ChannelManager::Create创建channel_manager_,传入webrtc::CreatePeerConnectionFactory步骤中创建的media_engine和worker_thread等。
  • cricket::ChannelManager::Create

    • 构造ChannelManager
    • 调用mediaEngine实例的init
  • CompositeMediaEngine::Init()

    • voiceEngine的init
    • 目前没有调用videoEngine的init
  • WebRtcVoiceEngine::Init()

    • 收集音频相关的编码器和解码器
    • 根据CreatePeerConnectionFactory步骤是否创建了audio_Mixer、process、Device决定创建。
    • 调用ApplyOptions,配置音频相关降噪回音消除等
    • 会根据配置和硬件是否支持决定是否硬件支持的回音消除、降噪等功能
    • 将最终决定的配置交给audio_process

CreatePeerConnection

  • PeerConnectionFactoryInterface::CreatePeerConnection

    • 有两个重载的版本,四个参数的版本会创建dependence并调用两个参数的版本。
    • 调用PeerConnectionFactory::CreatePeerConnectionOrError
  • PeerConnectionFactory::CreatePeerConnectionOrError

    • 创建cert_generator
    • 创建allocator,端口选择器,类型为BasicPortAllocator
    • 创建async_resolver_factory,//TODO
    • 创建ice_transport_factory,//TODO
    • 创建call,//TODO
    • 通过PeerConnection::Create创建peerConnection,接受五步创建的实例作为构造参数。config主要就是turn和stun服务器的地址。
  • BasicPortAllocator::BasicPortAllocator

    • 设置session_pool_size=0
    • 调用PortAllocator::SetConfiguration,除了构造会调用,AddTurnServer和Connection的Initialize也会调用
  • PortAllocator::SetConfiguration

    • 详情见下文
  • PeerConnection::Create

    • 创建dns解析模块
    • 检测ice相关的配置参数
    • 构造peerconnection并且调用Initialize。构造中的context就是peecConnectionFactary中的Context
  • PeerConnection::Initialize

    • 解析iceconfig也就是turn和sturn服务器
    • 调用InitializePortAllocator_n初始化PortAllocator
    • 记录configuration_
    • 构造StatsCollector,保存为成员。
    • 构造RTCStatsCollector,保存为成员。
    • 构造SdpOfferAnswerHandler,保存为成员。
    • 构造RtpTransmissionManager,保存为成员。
  • PeerConnection::InitializePortAllocator_n

    • 调用PortAllocator::Initialize,内部没什么逻辑,就是设置了一个初始化状态
    • 检查配置信息是否有效
    • 调用PortAllocator::SetConfiguration重设PortAllocator
  • PortAllocator::SetConfiguration

    • 记录stun_server到stun_servers_成员
    • 记录turn_server到turn_servers_成员
    • 设置turn server筛选偏好turn_port_prune_policy_
    • 设置condidata_pool_size,对应的是PortAllocatorSession的个数
    • 如果当前的PortAllocatorSession个数少于condidata_pool_size则通过CreateSessionInternal创建新的session对象加入到pooled_sessions_成员,如果多余则从末尾删除多的
    • 调用BasicPortAllocatorSession::StartGettingPorts开始收集port
  • BasicPortAllocatorSession::StartGettingPorts

    • 创建socket_factory,类型为BasicPacketSocketFactory,BasicPacketSocketFactory需要一个SocketServer来自于networkthread。networkthread维护epoll,出发socket事件。
    • 调用BasicPortAllocatorSession::GetPortConfigurations,异步调用
  • BasicPortAllocatorSession::GetPortConfigurations

    • 根据strun和turn服务器地址创建PortConfiguration对象
    • 调用BasicPortAllocatorSession::ConfigRea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值