多媒体开发之---live555的多线程支持,原本只是单线程,单通道
1)我对Live555进行了一次封装,但是Live555 是单线程的,里面定义的全局变量太多,我封装好dll库后,在客户端调用,因为多个对话框中要使用码流,我就定义了多个对象从设备端接收码流,建立多个连接,但是当一路码流退出,然后在退出另外的一路码流时,库里面出现问题,原因是Live555 里面的全局变量被破坏了!
针对上面问题:我目前的解决办法是将全局的信息隔离:
定义一个结构:
#define CLIENT_STREAM_NUM 4
class ourRTSPClient;
typedef struct _RtspGlobal
{
ourRTSPClient *pRtspClient;
NetSdk *pNetSdk;
}RtspGlobal;
//
RtspGlobal struRtspGlobal[CLIENT_STREAM_NUM];
这样每一路码流对应数组中的一项,就做成多线程的了,在全局的回调函数中,根据RTSPClient*rtspClient的指针和struRtspGloball数组中的指针进行比较,如果相同,就知道是哪个流对应的连接了,比如在continueAfterSETUP函数里面建立sink时,我们可以如下判断:
for (int i=0;i<CLIENT_STREAM_NUM;i++)
{
if (struRtspGlobal[i].pNetSdk!=NULL)
{
if (struRtspGlobal[i].pRtspClient==rtspClient)
{
scs.subsession->sink = CRtpMediaSink::createNew(env, *scs.subsession,
(RtpMediaSinkCallback)struRtspGlobal[i].pNetSdk->rtspDataCallback,
(void *)&struRtspGlobal[i],RTPMEDAA_SINK_RECEIVE_BUFFER_SIZE, rtspClient->url());
break;
}
}
}
这样使得testRtspClient例子支持到多线程了。
2)Live555 的断网重连问题
1)重连死锁
1.1)重连时如果将解码回调线程放在NetSdk里面,使用两个Event,当接受线程结束时,发送接受线程结束的信号,然后在解码线程里面判断接收线程信号 ,如果有信号,就发送一个退出解码线程,发送一个解码结束的信号;
1.2)当超时重连时,首先Stop码流,然后Restart码流;停止码流时,将eventLoopWatchVariable=1;让数据接收线程顺利退出;同时在stop函数里面等待解码线程结束,
WaitForThreadExit(m_DecodeExitEvent);
这时会造成死锁;因为Live555是单线程的,在超时函数中需要等待本线程的结束,造成死锁;
解决办法:
1)使用单独的心跳线程来实现重连功能或者在回调数据给客户端的的解码线程里面实现重连功能;
2)网络断开判断方法 使用延迟队列来判断,初始化时候调用noteLiveness,然后每次收到Sink的一帧数据时,再次调用noteLiveness,这样如果网络断开,超时后,就能判断出来;在数据接收线程的doEventLoop后面将重连标记置位:
m_bReConnect=true;
3)断网重连的工作不能放在livenessTimeoutTask这个函数里面,不然会造成重连死锁,因为live555是单线程的;只能放在其它的线程里面实现重连;我是放在回调给客户端的解码线程里面实现重连;
void NetSdk::noteLiveness(void* clientData,UsageEnvironment& env)
{
if (m_ReconnectTime> 0)
{
env.taskScheduler().rescheduleDelayedTask(fLivenessCheckTask,m_ReconnectTime*1000000,(TaskFunc*)livenessTimeoutTask, clientData);
}
}
void NetSdk::livenessTimeoutTask(void* clientData) {
TRACE("livenessTimeoutTask run\n");
RtspGlobal *pRtspGlobal=(RtspGlobal *)clientData;
pRtspGlobal->pNetSdk->fLivenessCheckTask= NULL;
UsageEnvironment& env = pRtspGlobal->pRtspClient->envir(); // alias
pRtspGlobal->pNetSdk->RestopVideo();
}
重连线程如下:
void NetSdk::DecodeThread(void *arg)
{
NetSdk *pThis=(NetSdk*)arg;
while (!pThis->m_bQuit)
{
if (pThis->m_bReConnect)
{
//
pThis->RestartVideo();
pThis->m_bReConnect=false;
}else
{
pThis->ImageDecodeAndShow();
}
}
SetEvent(pThis->m_DecodeExitEvent);
}
哪位有更好的办法,不妨告诉我!
http://blog.csdn.net/smilestone_322/article/details/18319867
多媒体开发之---live555的多线程支持,原本只是单线程,单通道的更多相关文章
- 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...
- 多媒体开发之---live555 分析客户端
live555的客服端流程:建立任务计划对象--建立环境对象--处理用户输入的参数(RTSP地址)--创建RTSPClient实例--发出DESCRIBE--发出SETUP--发出PLAY--进入Lo ...
- 多媒体开发之--- Live555 server 获取不到本地ip 全为0
今天把wis-streamer live555 移植到8148上面跑起来了,运行testOnDemandRTSPServer的时候发现,本地IP地址居然为0.0.0.0; 于是乎就跟踪调试了下,看看它 ...
- QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
开发背景: 1.直接用QSqlDatabase我觉得太麻烦了: 2.对于某些数据库,多个线程同时使用一个QSqlDatabase的时候会崩溃: 3.这段时间没什么干货放出来觉得浑身不舒服,就想写一个. ...
- HubbleDotNet 最新绿色版,服务端免安装,基于eaglet 最后V1.2.8.9版本开发,bug修正,支持一键生成同步表
HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会 ...
- 多媒体开发库 之 SDL 详解
SDL 简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的 ...
- LiveVideoStack Meet|深圳 多媒体开发新趋势
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...
- 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS
react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...
随机推荐
- Hbuilder 快捷键
最近在学习javaweb 在学前端的时候用到了一款国产编辑器 很棒 Hbuilder 快捷键 Ctrl + d 删除整行内容 Ctrl + Shift +R ...
- hdu 5020(斜率的表示+STL)
Revenge of Collinearity Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- MySQL自增锁模式innodb_autoinc_lock_mode参数理解调优
前段时间某数据表运行过程中,出现自增字段突然跳跃式增长的问题,潜心研究发现,问题导致原因可能是因为并发写入导致 于是通过各种途径查阅是因为innodb_autoinc_lock_mode参数设置的不同 ...
- luogu P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...
- 2016北京集训测试赛(十)Problem A: azelso
Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...
- Geoserver跨域问题
1 Geoserver位war包,使用Tomcat发布的情况 由于geoserver为war形式,需要解决tomcat跨域问题,geoserver版本为2.9.1. (1)下载跨域war包 下载cor ...
- Windows网络编程 2 【转】
Windows网络编程使用winsock.Winsock是一个基于Socket模型的API,在Windows系统中广泛使用.使用Winsock进行网络编程需要包含头文件Winsock2.h,需要使用库 ...
- GLSL逐顶点光照[转]
转载:http://blog.csdn.net/hgl868/article/details/7872350 引言 在OpenGL中有三种类型的光:方向光(directional).点光(point) ...
- Yii2 数据操作Query Builder
转载地址: http://blog.csdn.net/hzqghost/article/details/44117081 Yii2 数据操作Query Builder 分类: Yii22015-03- ...
- 实例化Spring容器的两种常用方式
//在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"b ...