webrtc---流程梳理总结

1.接收通话

​ 1.接收到消息onhanginread

​ 2.来自其他peer的消息 onmessagefrompeer

​ 3.初始化peerconnection
​ 1.CreatePeerConnectionFactory 用来创建音轨和视频轨
​ 2.peer_connection_factory_->CreatePeerConnection 根据turn服务器的参数创建config,再用config创建一个peerconnection
​ 3.创建AudioTrackInterface和VideoTrackInterface再创建一个MediaStreamInterface把它们加进来,最后都加入到peerconnection

​ 4.解析sdp类别
​ 1.如果是offer-loopback(神奇的挂断信号),需要重连
​ 5.解析sdp内容
​ 1.解析出sdp内容
​ 2.根据内容创建一个sdp
​ 3.peer_connection_->SetRemoteDescription将该sdp设置到peerconnection
​ 4.如果该sdp属于offer,创建一个answer

2.桌面共享原理

webrtc原有视频捕获原理

1.使用webrtcvideocapturer作为videocapture
2.webrtcvideocapturer内部使用VideoCaptureDS作为source
3.VideoCaptureDS捕获到的数据在DeliverCapturedFrame函数中回调给webrtcvideocapturer的OnIncomingCapturedFrame处理

备注:webrtcvideocapturer仅用于开启捕获和处理结果并发送,VideoCaptureDS才是真正的视频捕获模块

桌面共享实现

1.原理
1.在addstream的时候使用自定义的capture,暂且命名为testvideocapture
2.testvideocapture启动截屏线程,截屏数据丢给父类的onframe处理
3.循环截屏

2.实现
1.继承videocapture,修改视频捕获start等方法为桌面抓屏相关操作
2.在线程中实现抓屏操作,将结果转为I420格式,提交给videocapture处理,并循环开启线程,达到桌面共享的目的

3.关键点
替换videotrack、循环抓屏实现桌面共享

4.遗留问题
1.尺寸为自定义尺寸
2.画面模糊

3.SDP和IceCandidate

client1 connect client2

1.client1 sendmessage docall

2.client2 createpeerconnection,addstream…

3.client2 createoffer—>onsuccess::setlocaldescription(send offer)---->onicecandidate(send candidate to client1)

4.client 1 send candidate to client2

5.client2 addcandidate

4.视频捕获流程

参考链接:https://www.cnblogs.com/fangkm/p/4374610.html。源码略有不同,renders部分以下列内容为准

1.启动

1.创建videocapture----->创建videosource----->创建videotrack

2.在videosource的创建过程中会调用VideoSource::Initialize,在该函数中使用了channel_manager_调用StartVideoCapture,然后绑定到CaptureManager::StartVideoCapture上,并将videocapture传入,驱动了采集过程

2.采集器

WebRtcVideoCapturer仍然不是视频采集的真正实现,它创建一个VideoCaptureModule接口对象来完成真正的视频采集工作。该抽象接口是视频采集的实现接口,最终在Windows平台下由VideoCaptureDS(传统的DirectShow方式)和VideoCaptureMF(Vista之后的Media Foundation API实现方式)来实现采集工作

3.视频输出

videocapture::OnFrameCaptured接收到捕获结果,处理后发送SignalVideoFrame信号,转到VideoCapturer::OnFrame中,然后将捕获结果广播给所有注册对象

windows下注册renders的完整流程

1.创建videtrack

addstreams “Create video_track”—>VideoTrack::VideoTrack(video_source_->AddSink(&renderers_))

2.添加Render(末尾的renderers_.AddRenderer刚好把render添加到步骤1中的renders里面)

MainWnd::StartLocalRenderer—>VideoRenderer::VideoRenderer—>VideoTrackInterface(rendered_track_)->AddRenderer(renderers_.AddRenderer)

5.音频捕获流程

1.初始化音频设备

主线程(最后一步把initMediaEngine_w函数发送到工作线程执行)

CreatePeerConnectionFactory—>PeerConnectionFactory::Initialize()---->channel_manager_->Init()---->worker_thread_->Invoke(Bind(&ChannelManager::InitMediaEngine_w, this));

工作线程

ChannelManager::InitMediaEngine_w---->CompositeMediaEngine::Init---->WebRtcVoiceEngine::Init---->WebRtcVoiceEngine::InitInternal—>VoEBaseImpl::Init—>AudioDeviceModuleImpl::Create

2.录音

AudioDeviceWindowsWave::PrepareStartRecording()//开始录音

AudioDeviceWindowsWave::ThreadProcess()//对声音做处理

//暂时没办法知道声音数据怎么发送到Peer

3.播放

// create offer or answer成功后驱动数据的收集

MainThread: peer_connection_->SetLocalDescription---->InvokeOnWorker(Bind(&BaseChannel::SetLocalContent_w,this, content, action, error_desc));

**WorkThread:**VoiceChannel::SetLocalContent_w---->WebRtcVoiceMediaChannel::SetPlayout---->VoEBaseImpl::StartPlayout

你可能感兴趣的:(webrtc,C++,webrtc,C++)