当前位置:网站首页>ZLMediaKit源码分析 - WebRtc连接迁移
ZLMediaKit源码分析 - WebRtc连接迁移
2022-07-29 23:49:00 【fun binary】
简介
WebRtc支持连接迁移,即在网络切换时保证不断音视频传输。ZLMediaKit就实现此功能,下面我们来分析下ZLMediaKit时如何实现连接迁移的。
zlmediakit是如何实现连接迁移?
- 通过a=ice-ufrag:来标识一个session而不是5元组
- 如何保证连接迁移后多线程安全问题?
● 4G与wifi不同线程要写入到WebRtcTransport中
● 在创建Session对象时先去查找对象是否存在,存在就绑定到对象所在的线程
#if defined(ENABLE_WEBRTC)
//webrtc udp服务器
auto rtcSrv = std::make_shared();
rtcSrv->setOnCreateSocket([](const EventPoller::Ptr &poller, const Buffer::Ptr &buf, struct sockaddr *, int) {
//如果buf为空则直接返回
if (!buf) {
return Socket::createSocket(poller, false);
}
// 从WebRtcSession中查找是否ice-ufrag是否一样
auto new_poller = WebRtcSession::queryPoller(buf);
if (!new_poller) {
//该数据对应的webrtc对象未找到,丢弃之
return Socket::Ptr();
}
return Socket::createSocket(new_poller, false);
});
uint16_t rtcPort = mINI::Instance()[RTC::kPort];
#endif//defined(ENABLE_WEBRTC)
EventPoller::Ptr WebRtcSession::queryPoller(const Buffer::Ptr &buffer) {
// 读取ice-ufrag
auto user_name = getUserName(buffer);
if (user_name.empty()) {
return nullptr;
}
// 查找此用户的transport
auto ret = WebRtcTransportManager::Instance().getItem(user_name);
// 返回此用户所绑定的线程
return ret ? ret->getPoller() : nullptr;
}
边栏推荐
- devops学习(十) Jenkins 流水线
- C陷阱与缺陷 第4章 链接 4.2 声明与定义
- vim相关介绍(三)
- C陷阱与缺陷 第3章 语义“陷阱” 3.10 为函数main提供返回值
- leetcode122. Best Time to Buy and Sell Stock II 买卖股票的最佳时机 II(简单)
- 重写并自定义依赖的原生的Bean方法
- Brute force recursion to dynamic programming 03 (knapsack problem)
- 2022年企业直播行业发展洞察
- Adaptive feature fusion pyramid network for multi-classes agriculturalpest detection
- Add, delete, modify and query the database
猜你喜欢

SQL Server、MySQL主从搭建,EF Core读写分离代码实现

Vulkan与OpenGL对比——Vulkan的全新渲染架构

Farmers on the assembly line: I grow vegetables in a factory

EA&UML日拱一卒-多任务编程超入门-(7)关于mutex,你必须知道的

MySQL【基本select语句】

Paper Intensive Reading - YOLOv3: An Incremental Improvement

Mysql8.0新特性之详细版本

Windows 安装 MySQL 5.7详细步骤

NumPy(二)

devops学习(五) Jenkins 简单完成持续部署
随机推荐
Minesweeper game in c language
经典论文-SqueezeNet论文及实践
CesiumJS ^ source read [0] 2022 - article directory and source engineering structure
全网最强 JVM 来袭!(至尊典藏版)
标签分发协议(LDP)
【小程序项目开发-- 京东商城】uni-app之自定义搜索组件(下) -- 搜索历史
29岁从事功能测试被辞,面试2个月都找不到工作吗?
Brute force recursion to dynamic programming 04 (digital string conversion)
Comprehensive Practice - Three-Mison Chess Mini Game
环形链表(LeetCode 141、142)
一文看懂拉格朗日乘子法、KKT条件和对偶问题
关于 byte 的范围
决策树原理及代码实现
SQL Server、MySQL主从搭建,EF Core读写分离代码实现
Unity Addressables
卧槽,2行代码,让接口性能提升10倍
Install PyCharm on Raspberry Pi
C陷阱与缺陷 第3章 语义“陷阱” 3.10 为函数main提供返回值
[2023 School Recruitment Questions] Summary of knowledge points and hand-tear code in the written test and interview
devops学习(七) sonarqube 代码质检工具