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 ...
随机推荐
- jquery插件的基本写法
(function($){ var a={name:'2222',age:5555} var b={sex:'男',grade:5555} var c=$.extend({},a,b);//合并到新的 ...
- XMPP协议实现原理介绍(转)
XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...
- HTTP PUT方法和POST方法的区别
这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别 ...
- 升级 GCC 支持C++11 或 configure: error: *** A compiler with support for C++11 language features is required.
configure: error: *** A compiler with support for C++11 language features is required. 参考链接: (1)升级 G ...
- 搭建redis集群时所遇问题及解决方法
单独一台虚拟机(系统CentOS 7) 问题1 创建redis集群环境时,输入以下命令 [root@localhost redis-cluster]# ./redis-trib.rb create - ...
- UE3客户端服务器GamePlay框架
客户端(当前玩家)与服务器对应关系图: 整体上看,UE3的GamePlay框架使用的是MVC架构 ① 橙色的Actor对象及橙色箭头相连的成员变量只会被同步给Owner客户端 Controller:控 ...
- babel转码神器babel-preset-env
简介 现如今不同的浏览器和平台chrome, opera, edge, firefox, safari, ie, ios, android, node, electron 不同的模块 "am ...
- Codeforces 946 A.Partition
随便写写,然后写D的题解. A. Partition time limit per test 1 second memory limit per test 256 megabytes input ...
- 矩阵乘法加速fib数列
考虑矩阵(1,1)(1,0) #include<cstdio> #include<cstring> #include<iostream> using namespa ...
- NLP项目
GitHub NLP项目:自然语言处理项目的相关干货整理 自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域.本文作者为自然语言处理NLP初学者整理了 ...