WebRTC中最簡單loopback攝像頭&麥克風的例子【轉】
阿新 • • 發佈:2018-12-31
peerconnection_client本地回放原理
預設的client已經集成了本地回放程式碼,但是要想實現該功能,需要做少許修改。
預設的點選介面上的"connect"按鈕是連線到另一臺peer,其最終執行的函式為Conductor::StartLogin。
現在我們想要連線到本地,所以需要將該函式修改為:
void Conductor::StartLogin(const std::string& server, int port) {
InitializePeerConnection();
ReinitializePeerConnectionForLoopback();
return;
// old
if (client_->is_connected())
return;
server_ = server;
client_->Connect(server, port, GetPeerName());
}
//
InitializePeerConnection做了這麼幾個工作:
1. 建立peerconnection工廠例項
2. 建立PeerConnection
3. 新增流
這裡需要注意的是呼叫AddStreams的時候,會呼叫回撥Conductor::OnAddStream,在該回調最終會回撥到UIThreadCallback裡面,並將攝像頭輸入訊號拷貝一份到RemoteRenderer裡面。
程式碼如下:
void Conductor::UIThreadCallback(int msg_id, void* data)
{
// ...
case NEW_STREAM_ADDED: {
webrtc::MediaStreamInterface* stream =
reinterpret_cast<webrtc::MediaStreamInterface*>(
data);
webrtc::VideoTrackVector tracks = stream->GetVideoTracks();
// Only render the first track.
if (!tracks.empty()) {
webrtc::VideoTrackInterface* track = tracks[0];
main_wnd_->StartRemoteRenderer(track);
}
stream->Release();
break;
}
// ...
}
而ReinitializePeerConnectionForLoopback會建立一個Offer,作為PeerConnection的提供者。
程式碼如下:
bool Conductor::ReinitializePeerConnectionForLoopback() {
// ...
peer_connection_->CreateOffer(this, NULL);
// ...
}
呼叫CreateOffer會呼叫到Conductor::OnSuccess函式,在這裡會根據loopback_的值設定耳機回放麥克風內容。
這樣就完成了遠端和本地播放的是同一個視訊。
並且我將回放本地攝像頭的程式碼簡化了。
有需要的可以來這裡下載。