Webrtc从理论到实践九: 官方demo源码走读(peerconnection_client)(下)

本文深入分析WebRTC官方demo的peerconnection_client,讲解双击peer名后的连接过程,包括ICE建立的核心类、流程及视频数据采集与渲染。文章覆盖了CreatePeerConnectionFactory、CreatePeerConnection、添加音视频轨、SDP生成以及ICE建立的关键步骤,揭示了WebRTC在实际应用中的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

Webrtc从理论到实践一:初识
Webrtc从理论到实践二: 架构
Webrtc从理论到实践三: 角色
Webrtc从理论到实践四: 通信
Webrtc从理论到实践五: 编译webrtc源码
Webrtc从理论到实践六: Webrtc官方demo运行
Webrtc从理论到实践七: 官方demo源码走读(peerconnection_server)
Webrtc从理论到实践八: 官方demo源码走读(peerconnection_client)(上)



时序图

在这里插入图片描述


    在上篇,我们已经介绍到双方的peerList中都已经出现了对端的item,下篇,我们将结合流程图来继续介绍双击item后触发的事件。


一、双击peer名

    双击item后同样会在onMessage中处理,会判断发送消息的句柄是不是listbox_,然后会在OnDefaultAction()中处理。

bool MainWnd::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) {
   
  switch (msg) {
   
    //do something
    ...
    case WM_COMMAND:
      if (button_ == reinterpret_cast<HWND>(lp)) {
   
        if (BN_CLICKED == HIWORD(wp))
          OnDefaultAction();
      } else if (listbox_ == reinterpret_cast<HWND>(lp)) {
   
        if (LBN_DBLCLK == HIWORD(wp)) {
   
          OnDefaultAction();
        }
      }
      return true;
      ...
  return false;
}

    在OnDefaultAction()中先获取当前被选中的item的index,然后从item之前设置的Data中获取对方的peer_id,再调用ConnectToPeer()函数去连接对端

void MainWnd::OnDefaultAction() {
   
  if (ui_ == CONNECT_TO_SERVER) {
   
     //do something
  } else if (ui_ == LIST_PEERS) {
   
    LRESULT sel = ::SendMessage(listbox_, LB_GETCURSEL, 0, 0);
    if (sel != LB_ERR) {
   
      LRESULT peer_id = ::SendMessage(listbox_, LB_GETITEMDATA, sel, 0);
      if (peer_id != -1 && callback_) {
   
        callback_->ConnectToPeer(peer_id);
      }
    }
  }
}

    在ConnectToPeer()中我们需要重点关注InitializePeerConnection()这个函数,前面我们讲了PeerConnection对象是webrtc的核心,这个函数内部就是去创建PeerConnection对象。

void Conductor::ConnectToPeer(int peer_id) {
   
  //do some check
  ...
  ...
  if (InitializePeerConnection()) {
   
    peer_id_ = peer_id;
    peer_connection_->CreateOffer(
        this, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
  }
}

    在创建PeerConnection之前需要先调用CreatePeerConnectionFactory()创建一个PeerConnectionFactory对象,前三个参数,如果没有特殊需求,则传入nullptr,Webrtc内部会创建默认线程。

  • 网络线程工作在网络传输层,是专门用于处理网络收发包的线程,从网络接收的包会发给工作线程,工作线程要发送数据包也会交给网络线程.
  • 工作线程工作在媒体引擎层,包含视频采集线程,视频渲染线程,视频编码线程,视频解码线程等。
  • 信令线程工作在PeerConnection层,负责与应用层交互,例如createOffer,createAnswer等操作,并通知工作线程和网络线程相应的信号。
  • 第四个参数default_adm用于音频设备的管理。
  • 第五和六个参数用于设置音频的编解码器
  • 第七和第八个参数用于设置视频的编解码器
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值