关于EasyRTSPClient、EasyPlayer RTSP流重连问题的解释
EasyPlayer、EasyRTSPClient是如何设计重连的
首先大概解释一下EasyRTSPClient与EasyPlayer间的关系:EasyRTSPClient是一个专门用于与RTSP流媒体服务器交互的RTSPClient框架,类似于live555的OpenRTSP功能,他能够很好很兼容地实现RTSP OPTIONS、SETUP、PLAY、TEARDOWN等功能,还能进行数据回调的解析和网络事件的回调,更重要的是EasyRTSPClient非常稳定,用于工业级项目3年多,收到了很多用户发来的好评!
EasyPlayer的底层RTSP交互过程全部采用的是libEasyRTSPClient来实现的,这样EasyPlayer只需要专注于获取到的数据的处理过程,而且不需要关注其他的网络协议部分的功能,EasyPlayer只需要调用EasyRTSPClient的相关接口和回调处理,就能控制整个RTSP播放流程的运转了!
重点说一下EasyRTSPClient是如何进行RTSP重连过程的,EasyRTSPClient采用的是线程控制的,内部RTSP采用的是一个独立线程运行获取数据,再在获取到数据后,进行解析回调,外部线程进行时间统计,当超时时间内没有任何视频或者音频数据回调,外部线程会主动干涉内部RTSP线程,重新goto到RTSP初始状态,重新开始连接RTSP Server服务器;
上层对RTSP重连的多种控制方法
我们先观察EasyRTSPClient的事件回调:
‘
else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG)//回调连接状态事件
{
// EasyRTSPClient开始进行连接,建立EasyRTSPClient连接线程
if (NULL == _pBuf && NULL == _frameInfo)
{
printf("Connecting:%s ...\n", fRTSPURL);
}
// EasyRTSPClient RTSPClient连接错误,错误码通过EasyRTSP_GetErrCode()接口获取,比如404
else if (NULL != _frameInfo && _frameInfo->codec == EASY_SDK_EVENT_CODEC_ERROR)
{
printf("Error:%s:%d :%s ...\n", fRTSPURL, EasyRTSP_GetErrCode(fRTSPHandle), _pBuf?_pBuf:"null" );
}
// EasyRTSPClient连接线程退出,此时上层应该停止相关调用,复位连接按钮等状态
else if (NULL != _frameInfo && _frameInfo->codec == EASY_SDK_EVENT_CODEC_EXIT)
{
printf("Exit:%s,Error:%d ...\n", fRTSPURL, EasyRTSP_GetErrCode(fRTSPHandle));
}
}
‘
EasyRTSPClient会在几种情况下回调出状态:
- RTSPClient开始连接的时候;
- RTSPClient连接发送错误的时候会立即反馈回调;
- RTSPClient连接线程退出的时候;
EasyRTSPClient自身有重连功能,如果用户不想麻烦处理重连的过程,完全可以交由EasyRTSPClient内部处理,如果用户想接管重连过程,主要是处理 EASY_SDK_EVENT_CODEC_ERROR 和 EASY_SDK_EVENT_CODEC_EXIT 两种回调;
EasyPlayer
EasyPlayer是由EasyDarwin开源团队开发和维护的一个流媒体播放器项目,目前有RTSP版和Pro版两个版本,RTSP支持Windows(支持多窗口、包含ActiveX,npAPI Web插件)、Android平台,iOS平台,视频支持H.264,H.265,MPEG4,MJPEG,音频支持G711A,G711U,G726,AAC,支持RTSP over TCP/UDP,支持硬解码,是一套极佳的RTSP流播放组件;
EasyPlayer Pro版支持RTSP、RTMP、HTTP、HLS等各种流媒体协议播放,稳定、高效、可靠,支持Windows、Android、iOS!
获取更多信息
Copyright © EasyDarwin.org 2012-2017
最新文章
- mysql 中基础英语单词 (一)关于数据库创建与查找 (包括简写单词)
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
- tensor flow入门笔记
- 微软极品工具箱-Sysinternals Suite
- 字节流和字符流(PrintStream类和PrintWiter类)
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
- 【转】 Understanding Component-Entity-Systems
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章03
- Java7编程 高级进阶学习笔记--嵌套类
- android开发之路04(初级android工程师必会,你懂得!)
- dedecms 5.7文章编辑器附件上传图标不显示
- cloudera目录位置
- bestcoder单调区间
- JVM(一)JVM的基本结构
- Docker(二):Docker镜像使用
- SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
- synchronized(this) 与synchronized(class) 之间的区别
- npm cnpm yarn
- 【kindle笔记】之 《浪潮之巅》- 2018-1-
- BZOJ4963 : String
热门文章
- (3)Django 配置
- Codeforces Round #324 (Div. 2) Kolya and Tanya 组合数学
- sslstrip 中间人HTTP
- oracle小知识点16-诊断事件diagnostic events
- ios与js交互获取webview元素和赋值
- Beginning Auto Layout Tutorial in iOS 7: Part 4
- 【spring boot】在自定义拦截器中从request中获取json字符串
- Android性能优化第(二)篇---Memory Monitor检测内存泄露
- SilverLight.3-Validation:二、银光验证。TheLabel、TheDescriptionViewer和TheValidationSummary
- StringUtils和IOUtils工具包的使用