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
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.画面模糊
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
参考链接:https://www.cnblogs.com/fangkm/p/4374610.html。源码略有不同,renders部分以下列内容为准
1.创建videocapture----->创建videosource----->创建videotrack
2.在videosource的创建过程中会调用VideoSource::Initialize,在该函数中使用了channel_manager_调用StartVideoCapture,然后绑定到CaptureManager::StartVideoCapture上,并将videocapture传入,驱动了采集过程
WebRtcVideoCapturer仍然不是视频采集的真正实现,它创建一个VideoCaptureModule接口对象来完成真正的视频采集工作。该抽象接口是视频采集的实现接口,最终在Windows平台下由VideoCaptureDS(传统的DirectShow方式)和VideoCaptureMF(Vista之后的Media Foundation API实现方式)来实现采集工作
videocapture::OnFrameCaptured接收到捕获结果,处理后发送SignalVideoFrame信号,转到VideoCapturer::OnFrame中,然后将捕获结果广播给所有注册对象
windows下注册renders的完整流程
addstreams “Create video_track”—>VideoTrack::VideoTrack(video_source_->AddSink(&renderers_))
MainWnd::StartLocalRenderer—>VideoRenderer::VideoRenderer—>VideoTrackInterface(rendered_track_)->AddRenderer(renderers_.AddRenderer)
主线程(最后一步把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
AudioDeviceWindowsWave::PrepareStartRecording()//开始录音
AudioDeviceWindowsWave::ThreadProcess()//对声音做处理
//暂时没办法知道声音数据怎么发送到Peer
// 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