EasyDarwin开源流媒体服务器如何实现按需推送直播的
来源:互联网 发布:手机联系人数据恢复 编辑:程序博客网 时间:2024/05/01 05:52
--本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753
我们使用EasyDarwin的推流转发来进行媒体直播的时候,有时会有这样一个需求,当推流端推送的媒体没有客户端观看时,就希望推流端不再推送,也就是实现按需推送,当推流端使用4G网络时这个需求会更加强烈。
需求明确,那么说下实现。实现分为两步:触发和通知。
触发,EasyDarwin为每一路推流转发维护一个ReflectorSession对象,该对象的fNumOutputs属性用来指示当前拉流客户端的数量。当客户端停止拉流时会调用QTSSReflectorModule::DestroySession()->QTSSReflectorModule::RemoveOutput()->ReflectorSession::RemoveOutput(),其中ReflectorSession::RemoveOutput()代码如下:
其中(void)atomic_sub(&fNumOutputs, 1);用来减少当前的客户端数量,我们可以在此判断fNumOutputs是否为0,为0就表示满足我们的触发条件,修改后的代码如下:
触发之后我们就调用Easy_StreamStop_Role角色来通知完成停止推流。
上述触发并不完美,对于推流之后并没有客户端拉流这种情况无法处理。因此我们又增加了循环检测的机制,通过将ReflectorSession继承Task,然后在其Run函数里循环检测fNumOutputs是否为0可以有效的解决这种情况,ReflectorSession::Run()代码如下:
另外不要忘了在ReflectorSession的构造函数中调用this->Signal(Task::kStartEvent);来开始循环检测。
通知,OK,到此触发就搞定了,下面我们就需要把停止推流这个信息告诉推流端就OK了,由谁告诉?对于推流端的管理是由EasyCMS来进行的,因此我们需要先将停止推流信息告诉EasyCMS,然后让EasyCMS告诉指定的推流端。为此我们创建了EasyCMSSession来和EasyCMS进行通讯,创建了EasyCMSModule为外面调用角色提供接口。详细代码请参考https://github.com/EasyDarwin/EasyDarwin。
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
- EasyDarwin开源流媒体服务器提供的RTMP直播推送库
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
- 开源流媒体服务器--EasyDarwin
- EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库
- 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题
- EasyDarwin开源流媒体服务器低延时直播之转发缓存跟进算法
- EasyPusher安卓直播推流到EasyDarwin开源流媒体服务器工程简析
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
- EasyDarwin开源流媒体项目
- EasyDarwin开源流媒体服务器内存管理优化
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- [转载]EasyDarwin开源流媒体服务器内存管理优化
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- EasyDarwin开源流媒体服务器Work-stealing优化方案
- EasyDarwin开源流媒体服务器将select改为epoll的方法
- EasyDarwin开源流媒体社区视频教程
- 开源流媒体服务器
- linux 中常用编译参数解析
- 姓名测试代码
- ReactJS学习系列课程(React 表单应用)
- iOS 10 个实用小技巧(总有你不知道的和你会用到的)
- 天才小毒妃 > 第901章 宁静,你赢了
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
- PXC在插入数据时其它节点发生mysql crash并报UTC - mysqld got signal 11错误处理
- 将二叉搜索树转成要一个排序的双向链表
- MySQL数据库连接池
- Volley异常Volley NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException
- 去掉EditText的边框和下滑线
- Android中获取手机通信录中的联系人
- 简单的并发服务器
- iOS 把汉字转换成拼音并截取拼音第一个字母