系列文章目录
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用于音频设备的管理。
- 第五和六个参数用于设置音频的编解码器
- 第七和第八个参数用于设置视频的编解码器