1. 程式人生 > >WebRTC中最簡單loopback攝像頭&麥克風的例子【轉】

WebRTC中最簡單loopback攝像頭&麥克風的例子【轉】

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_的值設定耳機回放麥克風內容。



這樣就完成了遠端和本地播放的是同一個視訊。
並且我將回放本地攝像頭的程式碼簡化了。

有需要的可以來這裡下載