WebRTC中最简单loopback摄像头&麦克风的例子
2015-11-12 15:53
253 查看
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_的值设定耳机回放麦克风内容。
这样就完成了远端和本地播放的是同一个视频。
并且我将回放本地摄像头的代码简化了。
有需要的可以来这里下载。
默认的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_的值设定耳机回放麦克风内容。
这样就完成了远端和本地播放的是同一个视频。
并且我将回放本地摄像头的代码简化了。
有需要的可以来这里下载。
相关文章推荐
- JAVA EE架构师 需要具备的知识
- linux awk命令详解
- 基于Linux下的开源wavplay播放器
- Cenos(6.6/7.1)下从源码安装Python+Django+uwsgi+nginx到写nginx的环境部署(一)
- tomcat 访问日志配置
- 关于OpenNI2和OpenCV2的那些事——获取三维点云数据并用OpenGL表示
- Linux上安装MySQL时出现不兼容的解决办法
- XAMPP安装注意事项之apache
- 第一章:SolrCloud4.9+zookeeper在CentOS上的搭建与安装
- spark-submit [options]
- linux上编译live555
- linux命令:scp
- mysql忘记密码怎么办(windows linux)
- 数模混合监控,视频如何联动报警、消防、门禁?
- Linux的SOCKET编程详解
- Tomcat configuration: Memory - Heap and PermGen
- linux彻底卸载mysql
- [转] 《实用技巧》——让你的网站变成响应式的3个简单步骤
- 解决模板生成Linux虚机后网卡eth1变成eth0方法
- KALI LINUX 2.0 个人软件安装