rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法
EasyRTMPClient 简介
EasyRTMPClient是EasyDarwin流媒体团队开发、提供的一套非常稳定、易用、支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单。该EasyRTMPClient库未使用或参考现有的任何RTMP库,完全由EasyDarwin团队自主实现,因此,EasyRTMPClient更易于维护,稳定性、可扩展性得以提升,同时,本RTMP库全平台支持(包括windows/linux 32&64,ARM各平台,android, ios)!
相关连接
EasyRTMPClient调用示例地址:https://github.com/EasyDSS/EasyRTMPClient
由EasyDarwin团队推出的 RTMP协议教程:初级部分 进阶部分 高级部分
谈谈RTMP窗口大小
RTMP窗口大小基本概念
RTMP消息包一共分成三种类型。一类是命令(通知)消息,一类是音频消息,一类是视频消息。而窗口大小则属于第一种消息,即命令消息。窗口大小的本意是让对端了解与本端的通信状况,用以控制媒体传输流量的一种方案。通常,我们从RTMP服务器中进行拉取RTMP流到本地时,在协商的过程当中,会发送0x05,0x06消息包,即带宽值通知,通常设为2.5M。在实际的拉流过程中,我们通常隔一段时间就得向服务器报告,我们已经从服务中收到了多少数据量,此种报告,就是开篇所提到的窗口大小,即ack size确认。我在实际开发的过程当中,通常,当接收的数据量接近于3倍带宽值(2.5M*3)时,向服务器报告一下目前已接收了多少数据。经测试,针对于Flash Media Server(FMS)对该消息是比较敏感的(其它RTMP服务器,各方实现不同,对该窗口大小的确认或许没有如此敏感)。如果客户端未能及时向FMS回馈该数据,即使在正常的拉收数据流的过程当中,FMS也会断开与客户的连接。
由RTMP窗口大小引发的问题
上述,基本对RTMP窗口大小做了一个介绍。根据RTMP协议标准来看,RTMP窗口大小是通过0x03类型来标识的,其负载通常是四个字节,用大端序来表示当前窗口大小,即当前已接收的数据总量。前面,我们说过,FMS对窗口大小这条消息是十分敏感的,除了按上述方法,及时向FMS反馈0x03消息包(窗口大小确认)外,仍须注意另一个问题,即4字节溢出的情况。我们知道,4字节无符号,大概能表示4.29G左右的数据量,当从RTMP服务器所接收的数据量即将达到4.29G时,应及时的向RTMP服务器进行一次窗口大小的置零反馈。该bug是经过大量时间分析而得来,据后来查验,librtmp库也同样存在该bug(该Bug于2013/2014年左右遇到并分析处理),由于我没用librtmp库,因此,暂不能确认当前版本是否有修正该bug(应该没有修正 ^_^)。
EasyRTMPClient 中的处理
在实际的开发过程当中,当我们接收的数据量接近于4.29G时,我们及时将该值提前置0,反馈给FMS服务器即可。如果过早的置0,或直接等待其溢出,FMS同样会立即断开RTMP客户端。下面贴出EasyRTMPClient对上述Bug的处理代码:
int SendWindowAcknowledgementSize( MSRtmpSession * msrs )
{
int ret = 0;
MRPKT * pkt = NULL;
MPARASITICAL_BUFS * bufs = NULL;
pkt = allocRMPkt();
if ( !pkt )
{
return -1;
}
writeMessageHdr( 0x02, 0, 0, 0x03, -1, pkt );
bufs = msrs->msr->hdr.alloc( msrs->msr->hdr.hdr );
*( ( unsigned int * )bufs->buf ) = htonl( msrs->msr->info.recvInfo.bytes );
bufs->len = sizeof( unsigned int );
msrs->msr->info.ackSize = msrs->msr->info.recvInfo.bytes; // reference for next send ack size
fillPayload( bufs, pkt, msrs->msr );
commitMRPkt( pkt, msrs->msr );
ret = MRSendChunks( msrs, &pkt, -1 );
if ( msrs->msr->info.recvInfo.bytes + msrs->msr->info.clientBW * 3 > 4294967295 ) // stream bytes > 4.2G, ack clean.
{
msrs->msr->info.recvInfo.bytes = 0; // Improve by Inpilen.
msrs->msr->info.ackSize = 0;
}
return ret;
}
获取更多信息
EasyRTMPClient交流群:544917793
Copyright © EasyDarwin.org 2012-2017

rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法的更多相关文章
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...
- iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助. 直播拉流功能: 这里使用了开源的IJKPlayer第三框架,ijk ...
- Nginx 推流 拉流 --- 点播直播
1. 准备环境 安装操作系统Cenos 配置yum源 yum:https://developer.aliyun.com/mirror/ Nginx依赖 gcc-c++ zlib pcre openss ...
- 兼容性强、简单、成熟、稳定的RTMPClient客户端拉流功能组件EasyRTMPClient
EasyRTMPClient EasyRTMPClient拉流功能组件是EasyDarwin流媒体团队开发.提供和维护的一套非常稳定.易用.支持重连的RTMPClient工具,SDK形式提供,全平台支 ...
- iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit
收藏笔记 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机: ...
- 【转】直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit
原:https://www.cnblogs.com/baitongtong/p/11248966.html 1 .音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放 ...
- 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...
- Mac上搭建直播服务器Nginx+rtmp,实现手机推流、拉流
转载自http://www.cnblogs.com/jys509/p/5649066.html 简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网 ...
- 更精炼更专注的RTMPClient客户端EasyRTMPClient,满足直播、转发、分析等各种需求
现状 EasyRTMPClient,熟悉的朋友就会联想到EasyRTSPClient项目(https://github.com/EasyDSS/EasyRTSPClient),EasyRTSPClie ...
随机推荐
- 洛谷——P1098 字符串的展开
P1098 字符串的展开 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输 ...
- POJ 1054 The Troublesome Frog 枚举
这个题分类是dp,想了一会没有想出来,就去看别人题解了.发现别人题解全是暴力枚举= =.复杂度超过 N^2,但可能是剪枝的作用,没有超时. 思路:将所有点按坐标由小到大排序.两两枚举点p1,p2,并判 ...
- opentracing学习入门
http://blog.csdn.net/akfly/article/details/53975388
- js 拦截全局 ajax 请求
你是否有过下面的需求:需要给所有ajax请求添加统一签名.需要统计某个接口被请求的次数.需要限制http请求的方法必须为get或post.需要分析别人网络协议等等,那么如何做?想想,如果能够拦截所有a ...
- recovery怎么刷机,recovery是什么意思
转自:http://www.3lian.com/edu/2012/04-11/25212.html Recovery是什么意思? recovery翻译过来就是“恢复”的意思,是开机后通过特殊按键组合( ...
- MFC中 获取新输入编辑框的内容
//得到原始内容的长度 int len = m_editPoemFileStr.GetLength(); UpdateData(true); //得到新增加的内容 CString sNewStrin ...
- Linux常用的几个vi小命令
输入跳转命令: 命令行前 Ctrl+A 命令行后 Ctrl+E VI命令中: 当前行 行首 "0" 当前行 行尾 "Shift+4" 当前文档首行首字符:& ...
- Linux执行命令unable to create new native thread问题
对于系统的Linux的问题 主要是线程数有限制max user processes 参数限制 修改这个参数涉及到修改两个文件 vi /etc/security/limits.conf 增加如下内容: ...
- 转:maven2创建一个eclipse工程,设置M2_REPO
from: http://tonychanhoho.iteye.com/blog/1584324 M2_REPO是一个用来定义 maven 2仓库在硬盘中的存储位置,windows默认是C:\User ...
- Linux系统内核性能调优
做过Linux平台性能测试的童鞋平时可能会遇到如下问题: 1. TCP端口号不够用导致并发上不去(即与服务器端建立新连接失败) 2. TIME_WAIT状态连接过多导致应用服务器(Nginx.Hapr ...