多媒体开发之---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 ...
随机推荐
- struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t; ...
- Linux下的软连接和硬链接
由于教学上的原因,需要下载Android源码,后来使用repo时,系统提示需要python2,我的系统中是两个都有的,但是默认是python3,无法下载,通过创建了个链接搞定,下面就来说说linux下 ...
- msm8917 GPIO Voh(min)
有些 pin 可以當成多種 function, 此例以 GPIO function P3 voltage 為例 Voh(min) = 1.67 - 0.45 = 1.22 V
- Python Challenge 第十四关
14关页面上是两张图,一张是一个卷面包,一张类似条形码的东西.没任何提示,就看源代码,果然,有一行注释: <!-- remember: 100*100 = (100+99+99+98) + (. ...
- HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)
题目链接 rausen loves cakes 题意 给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...
- 转:ospf学习-----SPF最短路径算法
ospf学习-----SPF最短路径算法 常见的路由协议比如RIP.IGRP.BGP是距离矢量协议,OSPF和ISIS是数据链路状态协议.矢量协议路由器只知道本身和与自身相连的接口路由信息,矢量图只是 ...
- MyEclipse导入外部项目
1,File 2,Preferences 3,General----Existing----next 4,Browse选择要导入的项目---finash 5,导入后可能会出现很多error 检查项目的 ...
- Android中的多线程断点续传
Android多线程断点下载的代码流程解析: 运行效果图: 实现流程全解析: Step 1:创建一个用来记录线程下载信息的表 创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpen ...
- python测试网络可达性的方法
1.ping连通性测试 #!/usr/bin/env python #-*- coding: utf-8 -*- import os,sys,re import subprocess def NetC ...
- 记C++课程设计--学生信息管理系统
C++课程设计--学生信息管理系统 ...