1. 程式人生 > >peerconnection例子渲染本地視頻

peerconnection例子渲染本地視頻

ase manage ann conn 返回 work net 消息 voice

調試peerconnection例子,在WebRtcSession::CreateChannels函數中加上斷點,呼叫端和被呼叫端創建通道的流程並不一樣。呼叫端是從PeerConnection::SetLocalDescription往下執行創建的,而被呼叫端則是收到對端發來的消息後調用PeerConnection::SetRemoteDescription往下執行創建的。根據WebRtcSession::CreateChannels函數創建VoiceChannel和VideoChannel的流程,peerconnection客戶端程序首先調用到libjingle_peerconnection工程,以調用ChannelManager::CreateVoiceChannel為例,該函數以worker_thread_->Invoke形式調用ChannelManager::CreateVoiceChannel_w。

libjingle_peerconnection工程中的ChannelManager::CreateVoiceChannel_w函數,該函數首先執行libjingle_media工程中的 >CompositeMediaEngine<cricket::WebRtcVoiceEngine,cricket::WebRtcVideoEngine>::CreateChannel()函數,進而調用同工程的WebRtcVoiceEngine::CreateChannel()最終返回VoiceMediaChannel*,事實上是WebRtcVoiceMediaChannel指針對象,然後ChannelManager::CreateVoiceChannel_w函數調用libjingle_p2p工程中的cricket::VoiceChannel的構造方法,創建VoiceChannel*並最終返回給libjingle_peerconnection工程中的WebRtcSession類的成員變量talk_base::scoped_ptr<cricket::VoiceChannel> voice_channel_;而WebRtcSession則是作為同工程的PeerConnection類的成員變量talk_base::scoped_ptr<WebRtcSession> session_;。PeerConnection類則是peerconnection客戶端例子中Conductor類的成員變量talk_base::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;。

關於libjingle_media工程中的MediaChannel和libjingle_p2p工程中的BaseChannel的關聯:關註下ChannelManager::CreateVoiceChannel_w和ChannelManager::CreateVideoChannel_w兩個函數,這兩個函數中在分別創建繼承自BaseChannel類的VoiceChannel*和VideoChannel*時,分別以繼承自MediaChannel類的VoiceMediaChannel*和VideoMediaChannel*作為參數。然後分別調用VoiceChannel::Init函數和VideoChannel::Init函數,這兩個函數又會調用基類函數BaseChannel::Init,在基類函數中調用media_channel_->SetInterface(this);這樣兩個類就相互包含了。其中BaseChannel類中為成員變量MediaChannel* media_channel_;而MediaChannel類中為成員變量NetworkInterface* network_interface_;。BaseChannel類繼承自NetworkInterface。 調試發現libjingle_media工程中的兩個MediaChannel,即VoiceMediaChannel*和VideoMediaChannel*分別是WebRtcVoiceMediaChannel指針對象和WebRtcVideoMediaChannel指針對象。

peerconnection例子本地采集端采集到視頻渲染流程:

技術分享

peerconnection例子本地采集端采集到視頻後發送流程:

peerconnection例子渲染本地視頻