基于live555的rtsp 客户端模块优化 标签: live555rtsp客户端 2014-11-14 09:24 980人阅读 评论(0) 收藏 举报 分类: 流媒体(16) 版权声明:本文

基于live555的rtsp 客户端模块优化

标签: live555rtsp客户端
2014-11-14 09:24 980人阅读 评论(0) 收藏 举报
基于live555的rtsp 客户端模块优化 标签: live555rtsp客户端 2014-11-14 09:24 980人阅读 评论(0) 收藏 举报 分类: 流媒体(16) 版权声明:本文 分类:

之前发布过一个基于testRtspClient.cpp 改装的 rtsp client模块   http://blog.csdn.net/mtour/article/details/40073371

该模块支持多路rtsp流,基于这个模块做了一个录像服务

基于live555的rtsp 客户端模块优化 标签: live555rtsp客户端 2014-11-14 09:24 980人阅读 评论(0) 收藏 举报 分类: 流媒体(16) 版权声明:本文


录像服务需要稳定性比较好,在测试的过程中发现 运行几个小时 1天 后 程序出现崩溃。 经过仔细排查 做了如下优化解决


更改 BasicUsageEnvironment 库的 doeventloop函数


[cpp] view plain copy
  1. void BasicTaskScheduler0::doEventLoop(char* watchVariable) {  
  2.   // Repeatedly loop, handling readble sockets and timed events:  
  3.   /*while (1) { 
  4.     if (watchVariable != NULL && *watchVariable != 0) break; 
  5.     SingleStep(); 
  6.   }*/  
  7.     SingleStep();  
  8. }  

在库外层进行循环操作如下


[cpp] view plain copy
  1. static DWORD WINAPI StartRtspEventLoop(LPVOID pUser)  
  2. {  
  3.     theApp.g_scheduler=BasicTaskScheduler::createNew();  
  4.     theApp.g_env = BasicUsageEnvironment::createNew(*theApp.g_scheduler);  
  5.     while (theApp.g_WatchVariable)  
  6.     {  
  7.         //theApp.g_env->taskScheduler().doEventLoop(&eventLoopWatchVariable);  
  8.         WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);  
  9.         theApp.g_env->taskScheduler().doEventLoop();  
  10.         ReleaseMutex(theApp.g_eventLoopMutex);  
  11.     }  
  12.       
  13.     return 0;  
  14. }  

注意加互斥锁, 在 rtspclient对象的删除也加互斥锁


[cpp] view plain copy
  1. void CloseClientFun(void *data)  
  2. {   
  3.     if (!data)  
  4.     {  
  5.         return;  
  6.     }  
  7.     RTSPClient* pClient=(RTSPClient*)data;  
  8.     shutdownStream(pClient,0);  
  9. }  
  10.   
  11. int CStreamItem::Close()  
  12. {  
  13.     if (m_pRtspClient)  
  14.     {  
  15.         m_pRtspClient->m_lpStreamCallBack=NULL;  
  16.         m_pRtspClient->m_pUserData=NULL;  
  17.       
  18.         WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);    
  19.         theApp.g_scheduler->scheduleDelayedTask(1000*1000, CloseClientFun, m_pRtspClient);         
  20.         ReleaseMutex(theApp.g_eventLoopMutex);  
  21.           
  22.         m_pRtspClient=NULL;  
  23.     }  
  24.     return 0;     
  25. }  

客户端打开的代码 增加互斥锁


[cpp] view plain copy
  1. WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);  
  2. m_pRtspClient->sendDescribeCommand(continueAfterDESCRIBE);     
  3. ReleaseMutex(theApp.g_eventLoopMutex);  


引起报错的原因归根结底还是 Live555 单线程机制