> 技术文档 > WebRTC的peerconnection_client分析(1)——运行peerconnection_client和peerconnection_server_webrtc native peerconnection client

WebRTC的peerconnection_client分析(1)——运行peerconnection_client和peerconnection_server_webrtc native peerconnection client


一、引言

按照《Windows下编译WebRTC源码》编译WebRTC成功后,除了在src/out/Default/obj目录下生成webrtc.lib文件外,src\\out\\Default目录下还会生成WebRTC的各个exe文件。其中,包括peerconnection_client.exe和peerconnection_server.exe:

peerconnection_client.exe和peerconnection_server.exe是WebRTC官方提供的Windows平台的示例,用来给大家体验WebRTC语音视频通话的。其中,peerconnection_client.exe是语音视频通话通话示例的客户端程序,peerconnection_server.exe是语音视频通话通话示例的信令服务器。要想学习WebRTC源码,一般从分析peerconnection_client开始。peerconnection_client包含了大部分使用WebRTC的逻辑。本系列会简单讲解peerconnection_client的构成。

二、peerconnection_client和peerconnection_server的运行测试

要想进行peerconnection_client.exe和peerconnection_server.exe的语音视频通话测试,理论上是需要准备三台Windows主机的。主机1启动peerconnection_server.exe,主机2和主机3分别运行peerconnection_client.exe。但是如果缺乏机器,两个peerconnection_client和一个peerconnection_server可以都运行在同一台Windows主机上。

下面演示在一台Windows主机上同时运行这三个exe。注:如果想看到视频画面,该Windows主机必须有摄像头。如果没有,也可以外接USB摄像机,比如下面这些:

启动peerconnection_server.exe,默认监听8888端口:

启动第一个peerconnection_client.exe,填写服务器(peerconnection_server.exe)的ip和端口号,点击Connect按钮:

这里因为还没有启动另一个peerconnection_client.exe,所以“List of currently connected peers”为空,意思是已连接的peer端为空:

启动另一个peerconnection_client.exe,填写服务器(peerconnection_server.exe)的ip和端口号,点击Connect按钮:

由于之前已经启动了一个peerconnection_client.exe,所以“List of currently connected peers”会显示之前已连接的peer端的名称。双击该名称:

如果该Windows主机没有摄像头或只有一个摄像头,则效果如下,只能听到语音视频通话中的声音但不会显示视频:

如果该Windows主机有两个摄像头(摄像头不够可以外接USB摄像机),一个peerconnection_client分配一个摄像头,那是可以看到视频画面的,效果如下。可以看到确实能实现两个peer的语音视频通话:

三、修改WebRTC源码实现只有一个摄像头也能进行peerconnection_client运行测试

在WebRTC中peerconnection_client例子中含有实现本地回环测试代码,即src\\examples\\peerconnection\\client\\conductor.cc中的ReinitializePeerConnectionForLoopback函数,其定义如下。要想实现只有一个摄像头也能进行peerconnection_client运行测试,使用该函数即可:

bool Conductor::ReinitializePeerConnectionForLoopback() { loopback_ = true; std::vector<rtc::scoped_refptr> senders = peer_connection_->GetSenders(); peer_connection_ = nullptr; if (CreatePeerConnection(/*dtls=*/false)) { for (const auto& sender : senders) { peer_connection_->AddTrack(sender->track(), sender->stream_ids()); } peer_connection_->CreateOffer( this, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions()); } return peer_connection_ != nullptr;}

修改src\\examples\\peerconnection\\client\\conductor.cc中的StartLogin函数,该函数原本的定义如下:

void Conductor::StartLogin(const std::string& server, int port) { if (client_->is_connected()) return; server_ = server; client_->Connect(server, port, GetPeerName());}

将StartLogin函数修改为:

void Conductor::StartLogin(const std::string& server, int port) {/* loopback*/ InitializePeerConnection(); ReinitializePeerConnectionForLoopback(); return;/* if (client_->is_connected()) return; server_ = server; client_->Connect(server, port, GetPeerName());*/}

Visual Studio中选中peerconnection_client项目,点击“生成”,编译出新的peerconnection_client.exe可执行文件:

不需要启动peerconnection_server.exe,直接运行上述编译出来的新的peerconnection_client.exe可执行文件,点击“Connect”按钮:

可以发现实现本地回环的语音视频通话了: 

 

需要注意的是:WebRTC官方是不推荐这种本地回环方式的。规范禁止为loopback接口收集ICE候选项,因此这是非标准的,可能会导致其他一些实现出现问题。

四、没有摄像头也能进行peerconnection_client运行测试

电脑没有任何摄像头,也没法外接USB摄像机的情况下,理论上是可以通过安装OBS Studio,启动虚拟摄像头的方式进行peerconnection_client运行测试的。该方法我也没尝试过,大家有兴趣可以自行尝试下。

五、参考

《Allow a peerconnection to offer localhost identities. #708》

《WebRTC学习(八)peerconnection_client之loopback(回环)测试》