EasyDarwin开源流媒体服务器低延时直播之转发缓存跟进算法
2016-06-21 00:19
99 查看
前言
前一段时间,我们为EasyDarwin实现了客户端快速显示画面/听到同步声音的缓存关键帧检索方案,具体的实现方法分别在《EasyDarwin手机直播是如何实现的快速显示视频的方法》和《EasyDarwin手机直播转发快速显示问题之音频处理过程》两篇博客中可以了解到具体的实现原理,实现的方法代码也可以在EasyDarwin的ReflectorStream类中找到:问题需求
经过了一段时间的测试和项目检验,按照上述描述的流程,能够很好地实现快速显示功能,但转发过程中,还会出现随着转发时间的不断累积,转发的延时会越来越大,而通过我们的测试发现,这个延时主要是存在于长时间观看的客户端,而且新加入的客户端延时会很小,但过一段时间,延时就开始累积,那么我们就来进行一下问题的分析:由上图的分析我们可以看出,由于EasyDarwin转发到不同的客户端,客户端所在的网络环境不一样,发送的速度也就各不相同,一开始发送的开始位置P1的时候延时最小,最接近实时场景,但当客户端网络较差的时候,数据包发送就缓慢,那么这个过程中累积的数据就会越来越多,造成P2缓慢推进,而最新关键帧数据会不断更新P3,那么P2-P3的这个累积,就是主要延时所在;
问题解决
于是,我们定义了一个P2与P3之间的最大距离阀值,当P2 - P3超过了这个时间阀值,我们就发送的索引位置由P2跳动到P3,或者称这个过程为缓存跟进,由于是从当前发送帧(无论是I帧或者P帧)跳到最新的I关键帧,所以客户端不会出现花屏,只会出现画面跳动,P2与P3之间的最大距离阀值我们定义的越大,画面跳跃性可能就会越大,当然,阀值越大,出现跳跃的次数可能会越少,所以,我们需要定一个自己需要的阀值大小;此算法在EasyDarwin源码中的实现位置:ReflectorStream.cpp中的ReflectorSender::NeedRelocateBookMark方法;
版本及源码下载
流媒体服务器EasyDarwin:https://github.com/EasyDarwin/EasyDarwinEasyCamera手机直播/移动单兵监控端v1.0.16.0620:https://github.com/EasyDarwin/EasyCamera/releases/tag/v1.0.16.0620
手机直播客户端EasyClient:https://github.com/EasyDarwin/EasyClient
获取更多信息
邮件:support@easydarwin.orgWEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2016
相关文章推荐
- 强化:把treeview的QString路径转换为QModelIndex节点,有了节点就什么都好办了
- EasyDarwin开源流媒体服务器低延时直播之转发缓存跟进算法
- Eclipse智能提示及快捷键
- linux相关博客目录
- 安装过程中Oracle sid已经在使用(卸载oracle)
- 位运算--统计一个数的二进制序列中1的个数
- MAC JDK版本切换
- Android 使用RecyclerView实现多列布局及其优劣
- Shell脚本遍历目录
- Fragment简述
- 安卓开发之so库加载使用的那些坑
- android:configChanges属性
- anjularjs指令
- Facebook分享申请审核流程
- Java Web应用中支持跨域请求
- SpannableString 你应该知道的那些效果显示
- Oracle学习02【持续更新】
- 软件工程 团队项目总结
- LeakCanary:检测所有的内存泄漏
- Deep Learning 论文解读——Session-based Recommendations with Recurrent Neural Networks