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;
}

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

EasyRTMPClient交流群:544917793

Copyright © EasyDarwin.org 2012-2017

rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法的更多相关文章

  1. rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总

    EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...

  2. iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

    最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助. 直播拉流功能: 这里使用了开源的IJKPlayer第三框架,ijk ...

  3. Nginx 推流 拉流 --- 点播直播

    1. 准备环境 安装操作系统Cenos 配置yum源 yum:https://developer.aliyun.com/mirror/ Nginx依赖 gcc-c++ zlib pcre openss ...

  4. 兼容性强、简单、成熟、稳定的RTMPClient客户端拉流功能组件EasyRTMPClient

    EasyRTMPClient EasyRTMPClient拉流功能组件是EasyDarwin流媒体团队开发.提供和维护的一套非常稳定.易用.支持重连的RTMPClient工具,SDK形式提供,全平台支 ...

  5. iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

    收藏笔记 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机: ...

  6. 【转】直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

    原:https://www.cnblogs.com/baitongtong/p/11248966.html 1 .音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放 ...

  7. 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...

  8. Mac上搭建直播服务器Nginx+rtmp,实现手机推流、拉流

    转载自http://www.cnblogs.com/jys509/p/5649066.html 简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网 ...

  9. 更精炼更专注的RTMPClient客户端EasyRTMPClient,满足直播、转发、分析等各种需求

    现状 EasyRTMPClient,熟悉的朋友就会联想到EasyRTSPClient项目(https://github.com/EasyDSS/EasyRTSPClient),EasyRTSPClie ...

随机推荐

  1. Cryptography I 学习笔记 --- 数论简介

    0. Zn代表{0,1....n-1}的集合 1. 模运算符合交换律结合律 2. gcd(greatest common divisor),可以由扩展欧几里得算法快速得到. 3. 模逆(modular ...

  2. CRB and Candies LCM 性质

    题目 CRB and Candies 题意 \[ \text{给定正整数N,求} LCM \lbrace C \left(N , 0 \right),C\left(N , 1 \right),..., ...

  3. 2016集训测试赛(二十一)Problem C: 虫子

    题目大意 给你一棵树, 每个点有一个点权. 有两种操作: link / cut 修改某个点的点权 每次操作后, 你要输出以下答案: 在整棵树中任意选两个点, 这两个点的LCA的期望权值. Soluti ...

  4. php中for与foreach对比

    总体来说,如果数据库过几十万了,才能看出来快一点还是慢一点,如果低于10万的循环,就不用测试了.php推荐用foreach.循环数字数组时,for需要事先count($arr)计算数组长度,需要引入自 ...

  5. new子类会先运行父类的构造函数

    发现子类构造函数运行时,先运行了父类的构造函数.为什么呢? 原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super(); super(): 表示父类的构造函数,并会调用于参数相对应的父类 ...

  6. 快速销售订单 - OM:销售订单表单:级联行题头更改

    PROFILE OM:销售订单表单:级联行题头更改

  7. DEDECMS图片集上传图片出错302的解决办法

    无忧主机(www.51php.com)小编今天在调试dede网站的时候发现了一个问题,因为小编想在网站上增加一个图片集的栏目,于是就到后台图片集栏目去添加内容,谁知在上传图片的时候给我弹出个错误信息框 ...

  8. hdu2102 BFS

    这是一道BFS的搜索题目,只是搜索范围变为了三维.定义数组visit[x][y][z]来标记空间位置,x表示楼层,y和z表示相应楼层的平面坐标. #define _CRT_SECURE_NO_DEPR ...

  9. C++课程资源下载问题

    [来信] 贺老师,您好,我是江西某高校软件学院的一名在校学生.看了您在csdn上公布的博文和视频,我获益良多.不得不承认,之前的大学时光我是荒废了,立即就要大三了,我主攻的是C++方面.因此我悔过自新 ...

  10. Async.js解决Node.js操作MySQL的回调大坑

    因为JavaScript语言异步特性.在使用Node.js运行非常多操作时都会使用到回调函数,当中就包含訪问数据库.假设代码中的业务逻辑略微复杂一点,回调一层层嵌套.那么代码非常easy进入Callb ...