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);
// ...
这样就完成了远端和本地播放的是同一个视频。
并且我将回放本地摄像头的代码简化了。
默认的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_的值设定耳机回放麦克风内容。
这样就完成了远端和本地播放的是同一个视频。
并且我将回放本地摄像头的代码简化了。
有需要的可以来这里下载。