EasyDarwin流媒体服务器实现关键帧推送功能
—本篇由团队成员Fantasy供稿!
功能背景
随着社会进步,人们对产品体验要求越来越高。EasyDarwin也不例外。为了能满足用户对链接服
后看到画面时间(也就是我们经常看到的起播时间)短的要求,我们特地实现了关键帧缓存推送的功能。
技术知识介绍
- H264帧有多重模式,主流的有IPPPPPPPPPIPPPPPPPPPIPPPPPPPPPIPPPPPPPPPIPPPPPPPPP、IPPPBPPPBPPPIPPPBPPPBPPPI…模式,每一个I帧的出现为一个GOP,一般设置为50-100,意思是50到100帧出现一个I帧。IP模式,据了解,一般硬编码大多是这种模式,如海思,或者一些手机芯片。这种模式的特点是链状的,P帧参考前面的P帧,最前面的P帧参考I帧,这样如果丢了一帧,就会出现花屏的情况,IPB的模式则不同,B帧参考相邻前后帧,是前后帧的差值。I帧压缩率最低,P帧压缩率高,B帧压缩率最高;
备注:如果你是用x264库压缩,可以考虑调整帧之间的参考关系,满足低码率的要求的同时也能更好的恢复画面;
- I帧是完整帧,只要I帧出现后,用户才能看到画面。(有同学会问,IDR才是新画面的开始。答:好像目前很少有I帧不是IDR的)
问题点
直播时,如果用户加入会话组的时候上行推送用户推送的不是I帧,则用户需要等待一段时间才能看到画面。等待的时间会随着GOP的增大而随机性的增大,因为用户加入的时间点不同。
案例介绍:映客直播,刚进入房间就能很快看到画面,几乎是1s内,可以明显看到,来了画面之后,有一段类似快进的现象,这是怎么回事呢?因为后台缓存了大半个gop然后一次推送下来了,很多张画面在短时间内播放出来,就是快进的效果。
注意点:注意带宽容量,下行用户频繁的加入和退出会话组将会带来巨大的带宽压力,请综合估量,可以考虑加入配置,标注有多少用户能享受这等福利,当超过人数的时候只能不给予享受这个福利了。
EasyDarwin实现关键帧推送功能
在EasyDarwin中的实现,Keyframecache.h 和Keyframecache.cpp文件。在RTSPSession中处理推送上来的数据的时候,缓存一份到keyframecache中,(注意,RTP协议头没有协议头尾和长度信息,存储的时候只能自己在数据头前面加上协议头,数据长度和协议尾字节,这样取数据的时候,才能正常的按照接收到的数据包的格式一包包取出), 当有新用户加入output数组的时候,将用户标记newFlag设置为true,在下行转发数据的时候,先判断用户的newFlag标记是否为true,如果为true,则将缓存的数据推送下去,然后再转发事实的数据,以此来达到很快看到画面的效果。注意点,当带宽不够的时候,容易出现丢包,就会出现首个GOP花屏的现象,推送完之后清除newFlag标记。这个理解一下,带宽低避免不了,后期EasyDarwin团队考虑加入FEC机制,增加一定的抗丢包能力。
获取更多信息
Copyright © EasyDarwin.org 2012-2016

EasyDarwin流媒体服务器实现关键帧推送功能的更多相关文章
- EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器
在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时,我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 和 Ea ...
- 基于EasyDarwin EasyPusher实现Android手机直播推送功能
EasyPusher直播推送在之前就已经稳定支持了Windows.Linux.ARM上的RTSP直播推送功能,配合EasyDarwin开源流媒体服务器,延时基本在1s以内,这个技术方案经过一年多时间, ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
- APP如何实现推送功能
一.推送功能的集成 (1)在Umeng开发者中心,申请新应用,开通推送功能.此时需要上传开发推送证书和生产推送证书的p12文件. 申请证书的流程如下: >>1 创建开发推送证书 >& ...
- Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- 实现推送功能APP端需要完成的工作
推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...
- iOS10全新推送功能的实现
从iOS8.0开始推送功能的实现在不断改变,功能也在不断增加,iOS10又出来了一个推送插件的开发(见最后图),废话不多说直接上代码: 在开始之前需要打开一个推送开关,不然无法获取deviceToke ...
随机推荐
- gulp前端自动化入门
一.从零开始搭建gulp前端自动化 1.首先安装nodejs 2.npm init 初始化 生成package.json 2.1 可以选装cnpm cnpm是淘宝提供的服务 安装:命令提示符执行npm ...
- 转 C语言编译过程简介
C语言编译过程简介 C语言编译过程简介 刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C ...
- 标准C程序设计七---112
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- [转]iOS7 后台执行
[转自:http://esoftmobile.com/2013/06/23/ios7%E7%A8%8B%E5%BA%8F%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/] i ...
- poj 1573(搜索)
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12351 Accepted: 5982 Des ...
- SQL Server 内置函数实现MD5加密
一.MD5加密 HASHBYTES ('加密方式', '待加密的值') 加密方式= MD2 | MD4 | MD5 | SHA | SHA1 返回值类型:varbinary(maxim ...
- HTML-在canvas画图中,图片的线上链接已配置允许跨域后,仍然出错提示跨域,怎么解决?
这个问题我已经遇到了2次,第一次解决了后,第二次又遇到了,所以这次做个笔记,怕以后再次遇到 举例: 1.要实现的问题:我需要在canvas画布上画上我的微信头像 2.后台配置已经完成了允许我头像地址的 ...
- js-className修改class属性
1.修改className 1)修改class类名为p-a-0 2)在保留class="p1"的基础上再添加一个类名为p-a-0 2.删除className 1).结果需删除cla ...
- es6 ---- babel
babel-polyfill是ES6的补丁,由于babel只支持ES6语法部分的编译,对于新增的类我们还需要安装额外的polyfill,虽然现在Chrome和Firefox都已经添加了Promise等 ...
- sqlserverinternals.com
http://sqlblog.com/blogs/kalen_delaney/default.aspx https://sqlserverinternals.com/