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 ...
随机推荐
- foj Problem 2275 Game
Problem D Game Accept: 145 Submit: 844Time Limit: 1000 mSec Memory Limit : 262144 KB Problem D ...
- 【CF1029A】Many Equal Substrings(模拟)
题意:给定一个长度为n的串s,要求构造一个长度最小的使s出现了k次的串,可以重叠 n<=50,k<=50 思路:计算一下前后缀相同长度 #include<cstdio> #in ...
- 【CF1027B】Numbers on the Chessboard(数学)
题意:给定一个n*n的矩阵与生成矩阵的方式,多次询问同一个方格内(x,y)的数字是多少 题意:浪费人生的矩阵题,找规律 #include<cstdio> #include<cstri ...
- [LeetCode] Sort Colors 只有3个类型的排序
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 《Programming in C》读书笔记
该书由美国Seephen G.Kochan著 贾洪峰译,电子工业出版社,来源是九江学院图书馆采购,现在藏于九江学院图书馆逸夫楼. 本书的主要内容: 第一章.基础知识 第二章.编译和运行第一个程序 第三 ...
- Python入门--18--异常与try,except语句
Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) ...
- Requery,Refresh,Adoquery.Close,Open 区别
经过测试发现: Requery 相当于 Adq.Close,Open:并且比Close,Open方法有个优点就是不丢失排序,Sort Adq.Close,Open 后,原来的 Adq.Sort 会丢失 ...
- BZOJ——1622: [Usaco2008 Open]Word Power 名字的能量
http://www.lydsy.com/JudgeOnline/problem.php?id=1622 Description 约翰想要计算他那N(1≤N≤1000)只奶牛的名字的能量.每只 ...
- HDU 2460 Network 傻逼Tarjan
Network Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Hystrix的介绍和简单使用
这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下. 一.什么是Hystrix Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微 ...