高复用率的RTSPClient组件EasyRTSPClient设计流程概述
EasyRTSPClient 设计过程
概述
EasyRTSPClient 基于live555构建而成. 今天讲讲EasyRTSPClient的设计过程
EasyRTSPClient,主要包括以下部分:
1. 创建live555对象, 连接相机和收流
2. 解析收到的视频分辨率
3. 将SDP、音视频流、分辨率及其它相关信息通过回调函数进行回调
4. 回调连接、断线状态
5. 根据参数执行是否重连
创建live555对象,连接相机和收流
网上很多介绍的都是使用testRTSPClient来做客户端, 这个是没有问题的,但有一点需要注意的是demo中的代码,都是阻塞式的,如下:
env->taskScheduler().doEventLoop(&eventLoopWatchVariable);
这样就在主线程中阻塞了, 如果我需要它退出,该怎样实现呢?
有两种方法,目的是相同的,实现方式略有不同罢了:
1. 外部改变eventLoopWatchVariable的值为1
2. 通过BasicTaskScheduler0::doEventLoop(char* watchVariable)的实现可以看出, 这里实际上是进行一个无限循环. 当 watchVariable的值不为0时就退出. 所以我们可以自己创建一个线程,在线程内部实现调用 pTaskScheduler0->SingleStep(0), 即可实现对该线程的自由控制; 相当于1个线程对应1路到摄像机的取流;
解析视频分辨率
解析分辨率主要是sps_pps.h .c实现,是从VLC中提取出来的相关代码, 可正常解析H264,H265的分辨率;
回调SDP, 音视频流,分辨率及其它相关信息
在Live555的continueAfterDESCRIBE的回调函数中, 解析出SDP信息进行回调
void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString)
if (NULL != sdpDescription)
{
if (NULL != pClient) pClient->SetSDP(sdpDescription, (int)strlen(sdpDescription));
char *sprop_parameter_sets = strstr(sdpDescription, "sprop-parameter-sets=");
if (NULL != sprop_parameter_sets)
{
AnalysisH264SPSPPS(pClient, sprop_parameter_sets+21);
}
else
{
sprop_parameter_sets = strstr(sdpDescription, "sprop-sps=");
if (NULL != sprop_parameter_sets)
{
AnalysisH265SPSPPS(pClient, sprop_parameter_sets);
}
}
//回调出媒体信息
MediaSubsessionIterator iter(*scs.session);
MediaSubsession* subsession;
while ((subsession = iter.next()) != NULL)
{
if (strcmp(subsession->mediumName(), "video") == 0)
{
if (strcmp(subsession->codecName(), "H264") == 0)
{
mediainfo.videoCodec = VIDEO_CODEC_H264;
}
else if (strcmp(subsession->codecName(), "H265") == 0)
{
mediainfo.videoCodec = VIDEO_CODEC_H265;
}
else if (strcmp(subsession->codecName(), "MP4V-ES") == 0)
{
mediainfo.videoCodec = VIDEO_CODEC_MPEG4;
}
else if (strcmp(subsession->codecName(), "JPEG") == 0)
{
mediainfo.videoCodec = VIDEO_CODEC_MJPEG;
}
mediainfo.videoFps = (float)subsession->videoFPS();
mediainfo.videoWidth = pClient->params.width;
mediainfo.videoHeight = pClient->params.height;
}
if (strcmp(subsession->mediumName(), "audio") == 0)
{
}
}
if (NULL != clientObj && NULL !=clientObj->callback)
{
RTSPClientCallBack pRtspCallback = (RTSPClientCallBack )clientObj->callback;
if (NULL != pRtspCallback)
{
pRtspCallback(clientObj->channelInfo.id, (int *)clientObj->userPtr, MEDIA_TYPE_CODEC_INFO, (char*)&mediainfo, NULL);
}
}
}
回调连接、断线状态
断线状态的检测, 这里使用了一个时间对比的方式. 即用当前时间减去上一次获取到音视频流的时间,如果大于指定时长,则认为断线;
根据参数执行是否重连
检查重连参数,如果需要重连,则销毁当前的所有对象,再创建新的对象, 继续开始新的循环
if (NULL != pClient->rtspClient)
{
Medium::close(pClient->rtspClient);
pClient->rtspClient = NULL;
}
if (NULL != pClient->env)
{
pClient->env->reclaim();
pClient->env = NULL;
}
if (NULL != pClient->scheduler)
{
delete pClient->scheduler;
pClient->scheduler = NULL;
}
if (NULL != pClient->auth)
{
delete pClient->auth;
pClient->auth = NULL;
}
if (NULL == pClient->scheduler) pClient->scheduler = BasicTaskScheduler::createNew();
if (NULL == pClient->scheduler) break;
if (NULL == pClient->env) pClient->env = BasicUsageEnvironment::createNew(*pClient->scheduler);
if (NULL == pClient->env) break;
if (NULL == pClient->rtspClient) pClient->rtspClient = LiveRTSPClient::createNew(*pClient->env, pClient->channelInfo.url, RTSP_CLIENT_VERBOSITY_LEVEL, RTSP_CLIENT_NAME, 0, (void *)pClient);
if (NULL == pClient->rtspClient) break;
今天主要概述了EasyRTSPClient的设计流程, 下一篇将开始着重讲解具体实现细节;
以下是我写的基于live555的两个应用:
关于EasyRTSPClient
EasyRTSPClient是一套非常稳定、易用、支持重连的RTSPClient工具,SDK形式提供,接口调用非常简单,再也不用像调用live555那样处理整个RTSP OPTIONS/DESCRIBE/SETUP/PLAY的复杂流程,担心内存释放的问题了,全平台支持(包括Windows/Linux 32&64,ARM各平台,Android,iOS),支持RTP Over TCP/UDP,支持断线重连,连续维护与迭代超过5年,能够接入市面上99%以上的IPC,调用简单且成熟稳定!
关于EasyIPCamera
EasyIPCamera是一套非常稳定、易用、支持多种平台(包括Windows/Linux 32&64,Android,ARM hisiv100/hisiv200/hisiv400等平台)的RTSP Server组件,适用于IPCamera、内网RTSP服务等小型RTSP流媒体服务器,接口调用非常简单成熟,无需关注RTSPServer中关于客户端监听接入、音视频多路复用、RTSP具体流程、RTP打包与发送等相关问题,支持多种音视频格式,再也不用像调用live555 RTSPServer那样处理整个RTSP OPTIONS/DESCRIBE/SETUP/PLAY/RTP/RTCP的复杂流程和担心内存释放的问题了!
获取更多信息
Copyright © EasyDarwin.org 2012-2017

高复用率的RTSPClient组件EasyRTSPClient设计流程概述的更多相关文章
- 高复用率的RTSPClient组件EasyRTSPClient调用说明
EasyRTSPClient 调用说明 概述 EasyRtspClient是EasyDarwin家族中针对RTSP协议的拉流组件 EasyRtspClient视频支持H264.H265.MJPEG格式 ...
- IC设计流程概述
芯片设计分为前端设计和后端设计,前端设计(也称逻辑设计)和后端设计(也称物理设计)并没有统一严格的界限,涉及到与工艺有关的设计就是后端设计. Front-end design flow 1. 规格制定 ...
- 通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择.但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱 ...
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
- 微服务架构案例(05):SpringCloud 基础组件应用设计
本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 04:中间件 ...
- Steps 组件的设计与实现
NutUI 组件源码揭秘 前言 本文的主题是 Steps 组件的设计与实现.Steps 组件是 Steps 步骤和 Timeline 组件结合的组件,在此之前他们是两个不同的组件,在 NutUI 最近 ...
- ASP.NET通用权限组件思路设计
开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到 ...
- Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计
前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...
- Java高并发 -- J.U.C.组件扩展
Java高并发 -- J.U.C.组件扩展 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 FutureTask Future模式,核心思想是异步调用.和同步调用的区别 ...
随机推荐
- luogu P2949 [USACO09OPEN]工作调度Work Scheduling
题目描述 Farmer John has so very many jobs to do! In order to run the farm efficiently, he must make mon ...
- 洛谷2085最小函数值(minval) + 洛谷1631序列合并
题目描述 有n个函数,分别为F1,F2,-,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
- [转] makeFile文件作用
源文件地址 makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后 ...
- Android Actionbar 添加返回按钮
setHomeButtonEnabled这个小于4.0版本的默认值为true的.但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击.没有向左的小图标. true 图标可以点击 ...
- xamarin.ios 本地通知推送
由于ios10版本以后UILocalNotification被标为弃用了,所以要添加新的本地通知推送功能,下面提供一些代码参考. 一.先在AppDelegate.cs上注册本地通知推送功能. publ ...
- C#规范整理·泛型委托事件
基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是 ...
- mysql count(*) 和count(1)区别
count *更快, 不要加where,否则同count(1)效率相同 sql语句对大小写不敏感,关键字一般大写,其他小写, count(*)不加where,mysql会直接返回总条数,因为mysql ...
- Windows2003建立FTP服务器以及报530 User <用户名> cannot log in home directory inaccessible的解决方法
Windows2003建立FTP服务器: Windows2003建立FTP服务器 FTP连接 ...
- windows 网络编程[转]
利用winsock编写网络应用程序服务端的步骤简述如下WSAStartup 初始化网络编程库 socket 创建套接字 bind 指定地址.端口,绑定套接字 listen 进入监听状态 accept ...
- 【小程序】微信小程序开发实践
帐号相关流程 注册范围 企业 政府 媒体 其他组织 换句话讲就是不让个人开发者注册. :) 填写企业信息 不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的. 填写公司机构信 ...