WebRTC peerconnection_client/peerconnection_server分析

Webrtc从理论到实践八: 官方demo源码走读(peerconnection_client)(上) webrtc peerconnection_client通信流程上篇,讲述了关于界面切换,登录服务器等操作流程 阅读详情
可从https://download.youkuaiyun.com/download/dotphoenix/10505139下载测试程序,如需修改过的源码可联系dotphoenix@foxmail.com,或者直接从https://download.youkuaiyun.com/download/dotphoenix/10513835下载
整体说明 
bfWebRTC基于webrtc-native自带的peerconnection_client项目,实现了一个简单的信令协议客户端(服务器端位于bfWebRTCServer),并且使用webrtc音视频引擎来建立音视频通话。
bfWebRTC支持如下功能:
1.          信令客户端,用于呼叫建立机终止,代码主要位于peer_connection_client类中。
2.          支持音视频采集,播放,ICE框架,音频处理等,代码主要位于conductor类中。
测试步骤:
运行bfWebRtcServer.exe,该程序是一个信令服务器+中转服务器,信令服务器使用的是默认8888端口,中转服务器默认使用9999端口;该中转服务器仅仅支持一对通话,并且下次通话的时候需要重启该程序(因为中转服务器未实现清空上次通话数据的能力)。
 
bfWebRTC是客户端。通话的双方需要将他们各自的candidate里面的ip和端口都设为中转服务器的地址和端口(参考conductor类里面的OnIceCandidate函数的set_address调用)。
 
理论上讲fWebRtcServer.exe可以运行于公网上,只要在bfWebRTC里面设置正确的公网地址和端口即可。
 
文件说明
1.          Defaults.h和flagdefs.h中主要用于定义几个常量。
2.          Json_xxx系列文件及类主要用于json格式的构造和解析,因为信令格式是基于json的。
3.          Peer_connection_client主要用于信令的建立,sdp和candidate的交换,可以理解该类就是一个sip客户端,主要由该类调用conductor类中的函数,建立媒体流;推荐的做法是使用子节点sip类替换该类,不改动其架构。
4.          Conductor类,主要是封装了webrtc抽象出来的类,用于建立媒体流;该类是建立媒体连接的核心类,务必完全理解。
5.           Main_wnd类,界面的实现,注意其消息循环。
6.          Main.cc文件,该文件是启动类,注意,因为webrtc内部很多地方使用的是异步调用,依赖系统的主消息循环,所以必须参考该类的写法,最好不要使用基于mfc的框架,如果旧的界面库无法弃用,建议做成两个不同的进程,使用进程间通信来完成通信的建立。
详细说明
1.          Main.cc
在初始化的时候,必须调用全局的初始化函数。
 rtc::EnsureWinsockInit();
  rtc::Win32SocketServerw32_ss;
 rtc::Win32Threadw32_thread(&w32_ss);
 rtc::ThreadManager::Instance()->SetCurrentThread(&w32_thread);
rtc::InitializeSSL();
 
在退出时必须调用
rtc::CleanupSSL();
 
特别注意conductor类的构建,scoped_refptr类型的指针不能乱用;
 PeerConnectionClientclient;
  rtc::scoped_refptr<Conductor> conductor(
        newrtc::RefCountedObject<Conductor>(&client, &wnd));
 
2.          Peer_connection_client.h类
 
structPeerConnectionClientObserver{
 virtualvoidOnSignedIn() = 0; // 登录服务器成功
 virtualvoidOnDisconnected() = 0;//与服务器连接中断,通常是我们主动断开连接,比如退出登录等
 virtualvoidOnPeerConnected(intid, conststd::string& name) = 0; //有新的peer登录到服务器
 virtualvoidOnPeerDisconnected(intpeer_id) = 0; //有peer与服务器中断连接
 virtualvoidOnMessageFromPeer(intpeer_id, conststd::string& message) = 0; //有消息从peer发给我
 virtualvoidOnMessageSent(interr) = 0; //消息发送成功
 virtualvoidOnServerConnectionFailure() = 0; //与服务器的连接中断,通常是被动,比如登录服务器失败
 
 protected:
 virtual~PeerConnectionClientObserver() {}
};
该接口用于当信令层有变化的时候通知对该变化感兴趣的调用者。在该项目,conductor类实现了该接口,用于当信令层变化的时候,通知界面或者更新媒体部分。
 
注意:
和界面的交互是由conductor类完成的(通过调用UI层向其注册的MainWndCallback接口实现来完成),这和我们想象的通常应该由信令层和界面交互,然后调用媒体层不太一样,猜测可能的原因是conductor类需要系统的消息循环配合工作,比如有些由底层回调的函数不能操作某些函数(这些函数需要在主消息循环里面进行)。所有如果信令层有变化需要通知UI(比如登录成功,登录失败等需要刷新界面时),则通过调用conductor实现的接口类(PeerConnectionClientObserver)来实现。
 
 
int my_id_; 
//信令服务器分配给我们的id,存储于http头的如下字段:Pragma: 10,另外在服务器推送的数据中(比如有新登录的peer),content字段如下: alex1527474869@alex-imac-win7,10,1,第二个字段如果和这个一样,那就是我们自己,如果不一样,就是一个新的peer。
 
信令客户端会和服务器建立两个异步socket
std::unique_ptr<rtc::AsyncSocket> control_socket_; //用于发送数据给服务器,发送onconnect_data_里面的数据
std::unique_ptr<rtc::AsyncSocket> hanging_get_; //用于接收服务器主动推送过来的消息
std::string onconnect_data_; //发送给control_socket_的数据, 用于登录,退出,呼叫其它peer,给通话的peer新的candidate,和通话的peer断开等。
std::string control_data_; 收取从control_socket_读到的数据,通常发送成功,就接着读取response,这个其实可以设为局部变量,只有一个函数使用
std::string notification_data_; //hanging_get_这个socket推送过来的通知消息,一般是peer上线/下线,或者被呼叫的SDP,或者对方新的candidate等,OnMessageFromPeer主要处理
std::string client_name_;//我们自己的名字
Peers peers_; //当前系统所有已登录的peer,是一个id-name的映射
 
OnXXXX函数,该类使用了webrtc自带的sigslot机制,AsyncSocket基于该机制,可以向其注册回调函数,当不同的网络事件发生后,回调函数会被调用,比如OnConnect表示连接成功,OnRead表示有数据收到,OnClose表示连接中断。
 
 
3.          Conductor类
Conductor类封装了webrtc提供的完整媒体能力。并且负责和界面交互;他实现了四个接口:
webrtc::PeerConnectionObserver //PeerConnection回调接口,用于RTCPeerConnection事件,主要注意其OnIceCandidate函数,这个函数当底层有新的candidate产生的时候会被回调,注意这个函数对我们也非常重要,我们的机制是通过修改candidate里面的address来强制使用中转服务器,所以当我们收到该回调后,需要修改ip和port的值,然后再发送给peer.
webrtc::CreateSessionDescriptionObserver // 底层生成SDP后回调,我们将此SDP发送给peer,这个通常主叫才会生成,被叫通常需要将此SDP交与底层。
PeerConnectionClientObserver//用于当信令层有变化的时候通知
MainWndCallback//用于主界面的操作
 
  intpeer_id_; //呼叫建立的对方的peer id
  boolloopback_; //是否本地loopback,可以不管
  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;//webrtc核心类,由工厂peer_connection_factory_创建,用于管理一次媒体通信相关的资源,比如端口分配,ice配置等。
  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
      peer_connection_factory_; //webrtc核心工厂类,用于管理音视频的编解码工厂,音频设备工厂,工作线程等。
  std::unique_ptr<rtc::BasicNetworkManager> default_network_manager_; //如果需要自己指定rtp端口,需要实现该类
  std::unique_ptr<cricket::PortAllocator> port_allocator_;//rtp端口分配的实现类,如果需要自定义端口返回,参考代码的NOT_USE_DEFAULT_RTP_PORT宏定义
#ifdefNOT_USE_DEFAULT_RTP_PORT
  PeerConnectionClient* client_; //信令连接对象
  MainWindow* main_wnd_;//主窗口对象
  std::deque<std::string*> pending_messages_; //待发送消息
  std::stringserver_; //服务器地址
注意:
a.   SendMessageToUI和UIThreadCallback这2个函数要特别注意,相当于有些数据或者事件要处理的时候,不能直接处理,需要先使用SendMessageToUI将消息发送给主界面内,然后主界面类再调用UIThreadCallback函数来处理该消息,原因在前面已经讲过了,就是webrtc有些类和函数只能在有消息循环的线程里面调用。
 
b.          SUPPORT_VIDEO宏控制是否需要指出VIDEO
c.           SIP如果要调用该类,建议也实现类似的架构,当OnSuccess回调的时候,需要将SDP发送给对方;当OnIceCandidate回调的时候,修改相关的值之后,要通过相关SIP指令发送给对方。
 
4.          Main_wnd类,界面实现的主类,其定义了MainWndCallback接口,并且实现该接口的类要通过调用RegisterObserver函数将其注册给main_wnd类。
XXXRenderer相关函数跟视频有关,可以忽略
 
WebRTC中peerconnection示例工程结构分析 WebRTC Native代码相当的大(大约200Mb),开始的时候对这些代码真的是一头雾水,最后决定先从example中的peerconnection先看起。 peerconnection例子分为client端和server端,多个client加入对话,server负责信令的处理,这里主要讨论与WebRTC较为相关的client Demo。 代码结构: 这个例子用Gtk图形库开发,其中... 阅读详情

相关推荐

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

ICE连接建立以及视频数据采集源码分析

qq_39304481的博客 1422

WebRTC源码分析——呼叫建立过程之三(创建PeerConnection)

0 前言 当端与服务器建立连接之后,可以通过与服务器的信令交互获知对等端点的存在。当需要与对方端点建立P2P连接时,第一步是先创建PeerConnectionFactory对象,然后再通过PeerConnectionFactory工厂来创建PeerConnection对象。如图中红色字体所示。 在example/peerconnection_client工程中,发起方调用如下代码来创建PeerC...

ice_ly000的博客 9940

WebRTC Native框架(五)

代码实现上将PeerConnection和windows作为两个独立的组件,用conductor类管理起来。发送完登录请求和SDP请求之后,由网络线程一直检测来自网络的数据,并触发相应的函数,如更新列表和对端发来的数据,最终调用OnMessageFromPeer处理对端发来的数据,如果对端是新来的,则会创建InitializePeerConnection对象,这在主动发起会议时已经见过,如果是主动发起方回调了这个函数,就不会再创建这个对象了,但是依然要解析对端的SDP信息,SDP信息是JSON格式。

2401_89609705的博客 1130

webrtc示例peerconnection_client&server

1,使用 执行peerconnection_server后,服务器默认会监听本地8888端口;执行peerconnection_client,界面会转到现有的用户列表(暂时为空),服务器那边会打印出有新用户连接的消息;再执行一个peerconnection_client,连接到服务器,此时用户列表里就有先前的client,而先前连接的client的用户列表里则会出现新连接上的client;双击c...

风平浪静的专栏 1665

Debian 10系统下编译/测试WebRTC

1. 安装depot_tools (1)Clone depot_tools 代码(本地环境放到了路径/usr/src/) git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git (2)设置PATH环境变量 export PATH=/usr/src/depot_tools:$PATH (3) 创建web...

liliangnike的博客 1434

C++ WebRTC PeerConnection介绍

学习webrtc的第一步是学习PeerConnection,虽然现在的webrtc源码异常庞大,万事开头难,只要找好了入口,就可以进行摸索了,webrtc vs2019 c++项目目前我所用的版本一共有1286个子项目,如下图: 在这篇文章之前,我介绍了webrtc的摄像头采集,桌面采集的方法,这些都是webrtc最基础的模块,没有他们就无法进行音视频通信,而webrtc最上层的PeerConnection接口依赖与摄像头采集,桌面采集等模块。PeerConnection是学习WebRTC的第一步,但是P

琅嬛福地 1923

webrtc之peerconnection_server详解

前面分析webrtc的peerconnection_client协议流程,本文将分析webrtc的peerconnection_server流程。因为整个webrtc 的server分为turn-server,stun-server ,signal-server,这里的peerconnection_server中的server仅仅指的是signal-server。 Webrtc 部署框架 一、信令服...

江海细流的专栏 1791

C++ WebRtc peerconnection_client源码分析 (一)

  peerconnection_client和peerconnection_server代码调试稍微比较麻烦,因为是两个项目,需要合理的打断点,不然调试不了。peerconnection_client的源码很有深度,除了webrtc的音视频网络传输外,用到了大量的C++高级用法,例如信号槽,不是只有Qt里才有信号槽,webrtc也是用了大量的信号槽;异步socket、工厂模式、单例模式、观察者模式、异步调用等等,在webrtc的源码里应有尽有,我也是看了webrtc的源码,才知道原来C++还可以这样玩。

琅嬛福地 1082

史上最详细的webrtc-streamer访问摄像机视频流教程

最近公司在搞流媒体,我推荐了webrtc-streamer进行搭建,使用了一段时间后,出现新的需求,需要将内网的摄像机进行公网访问,我查询了几乎所有的帖子和github的问题回复,都没有给我一个准确的答案,经过不断尝试和摸索,我终于成功了,我希望将我的过程记录下来,让更多的中国开发者可以少走弯路,我对于webrtc不是很了解,但是这并不影响我使用开源的webrtc-streamer进行开发。

吭吃瘪肚的博客 6万+

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 285

使用peerconnection_client/server分析webrtc的NAT穿透功能

webrtc是一个优秀的跨平台实时音视频通信技术,是一个peer to peer的通信模式。在网络通信中,p2p通信必然会涉及到nat的穿透问题,webrt通过ICE技术来提供NAT穿透功能。ICE(Interactive Connectivity Establishment),它定义了一个技术,这个技术使用了stun/turn协议,它可以使得客户端能够发现自己的候选通信地址,这些候选地址包括本地地址、本机对应的公网地址、中继服务器的地址,两个客户端通过信令服务器来交换这些候选地址,就可以实现点对点的通信/

weixin_29405665的博客 1173

STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案

本文深入解析STM32F103多通道PWM输出中的TIM1_CH1异常问题,提供从时钟配置到GPIO复用的系统化解决方案。通过黄金法则配置流程和高级调试技巧,帮助开发者快速定位并解决PWM输出不稳定、占空比异常等问题,同时拓展多定时器协同和互补PWM等高级应用场景。

weixin_29194817的博客 117

WebRTC的peerconnection_client分析(1)——运行peerconnection_client和peerconnection_server

本文介绍了WebRTC官方示例程序peerconnection_client和peerconnection_server的运行与调试方法。文章首先说明这两个程序的功能:客户端和信令服务器,用于体验WebRTC音视频通话。详细演示了在同一台Windows主机上运行三个程序的测试方法,包括连接过程和视频显示效果。针对单摄像头情况,提出了修改源码实现本地回环测试的解决方案,具体给出了需要修改的Conductor::StartLogin函数代码,并展示了修改后的运行效果。最后提到在没有摄像头的情况下可以考虑使用OB

崔杰城的博客 1542

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置1.打开ESXI的SSH2.找到不能添加的硬盘路径3.用SSH操作 1.打开ESXI的SSH 2.找到不能添加的硬盘路径 我的是第一个,找到你要添加但是不能添加的那个硬盘,点进去。 完整的路劲为:1/2 比如我的: /vmfs/devices/disks/t10.ATA_____ST500LT0122D1DG142___________________________________S3PHRNHQ (比较长哈!) 3.用SSH

AI_DOG的博客 2万+

使用 Simulink 进行电力电子系统的小信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。小信号模型仿真的目的是通过线性化非线性系统来评估其动态特性,包括增益、相位裕度、带宽等指标。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的小信号模型仿真。背景介绍。

xiaoheshang_123的博客 480

WebRTC PeerConnection Client源码分析3-Conductor

本文分析的webrtc的版本是:m84 平台:win10 WebRTC PeerConnection Client源码分析<1>-main window WebRTC PeerConnection Client源码分析<2>-PeerConnectionClient WebRTC PeerConnection Client源码分析<3>-Conductor 注:下文中所谓的回调函数,实际上是虚函数。把虚函数说成回调函数是为了描述方便。 Conductor是Pee

专注音视频基础、WebRTC、ffmpeg、流媒体服务器 1660

YOLO26魔改神技:YOLO26引入SimAM(无参注意力):不增加网络参数的3D能量函数提点黑科技

文章摘要 2026年YOLO26模型发布引发边缘计算革命,但特定场景精度不足问题催生注意力机制改进需求。本文聚焦无参数注意力机制SimAM,基于神经科学理论通过3D能量函数直接计算神经元权重,实现零参数量提升模型性能。文章深度解析YOLO26四大创新架构,对比SimAM与传统注意力机制差异,并探讨其在YOLO26中的集成方案。研究显示,SimAM在不增加模型体积前提下显著提升mAP指标,特别适合边缘端部署。全文涵盖架构设计、代码实现、竞品对比、部署方案等维度,为轻量化视觉模型优化提供系统解决方案。

ZDQ58818的博客 274

WebRTC example peerconnection剖析

WebRTC 提供了许多 example,本文介绍 peerconnection example 的使用与代码流程分析,通过该示例可以帮助理解 WebRTC 信令交互,媒体协商,音视频数据交互等流程。该示例涉及两个角色:peerconnection_server,peerconnection_client。peerconnection_server 是一个信令服务器,它负责连接成员的管理以及信令交互与转发。

椛茶的博客 2866

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

AI人人懂 3166

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 281

WebRTC学习进阶之路 --- 十三、分析源码音视频互动peerconnection-client+server实例

WebRTC学习进阶之路系列总目录:https://blog.youkuaiyun.com/xiaomucgwlmx/article/details/103204274 学习一个框架最好的入手点之一就是首先学会如何方便快捷的使用它达到我们想要的效果,然后再去逐步分析每一个过程的具体实现细节,这样思路会更加清晰一些。WebRTC为我们提供一个非常完整凝练的音视频互动案例作为入手分析点,下边我们来详细分析下这个...

SmallBottle-CGWLMX的博客 2008

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

webRTC示例分析(四)——peerConnection-client

整个demo中有3个主要的类分别是: 窗口类MainWnd,它的主要功能是实现了一个窗体程序, PeerConnectionClient类,他的作用是与信令服务器(server)来进行TCP通信, 将MainWnd类和PeerConnectionClient类 连接在一起的Conductor类,Conductor实现了MainWndCallback和PeerConnectionClientO...

优快云的博客 2418

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

peerconnection_client分析笔记

Windows版本的peerconnection_client demo是一个win32程序,入口函数为main.cc里面的wWinMain,程序整体流程就从这个入口函数下手开始分析。 1.peerconnection_client demo中主要的类的关系 整个demo中有3个主要的类分别是窗口类MainWnd,它的主要功能是实现了一个窗体程序,然后是PeerConnectionClient...

风平浪静的专栏 3858

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

webRTC源码结构简单分析(一)

webRTC是什么?请参看链接。 这里我已经下载并编译好了,然后梳理一下结构。仅作为学习笔记,如有错误,欢迎指出。 如果你还没有下载或编译,请参看,链接1, 链接2. 1、首先webRTC下载之后,是src文件,然后这个文件中有很多文件夹及其他,这里截取部分,如下: 2、其中example文件夹中,是webRTC给出的各种应用实例的demo。 目前作为入门,我是先研究peercon...

优快云的博客 4489
上一篇: WebRTC Windows/Linux版构建过程(2018年6月)
下一篇: XCode使用googletest(包括googlemock)
dotphoenix
博客等级 码龄19年 208粉丝 137原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值