1. 程式人生 > >基於live555的rtsp 客戶端模組優化

基於live555的rtsp 客戶端模組優化

該模組支援多路rtsp流,基於這個模組做了一個錄影服務


錄影服務需要穩定性比較好,在測試的過程中發現 執行幾個小時 1天 後 程式出現崩潰。 經過仔細排查 做了如下優化解決

更改 BasicUsageEnvironment 庫的 doeventloop函式

void BasicTaskScheduler0::doEventLoop(char* watchVariable) {
  // Repeatedly loop, handling readble sockets and timed events:
  /*while (1) {
    if (watchVariable != NULL && *watchVariable != 0) break;
    SingleStep();
  }*/
	SingleStep();
}

在庫外層進行迴圈操作如下
static DWORD WINAPI StartRtspEventLoop(LPVOID pUser)
{
	theApp.g_scheduler=BasicTaskScheduler::createNew();
	theApp.g_env = BasicUsageEnvironment::createNew(*theApp.g_scheduler);
	while (theApp.g_WatchVariable)
	{
		//theApp.g_env->taskScheduler().doEventLoop(&eventLoopWatchVariable);
		WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);
		theApp.g_env->taskScheduler().doEventLoop();
		ReleaseMutex(theApp.g_eventLoopMutex);
	}
	
	return 0;
}

注意加互斥鎖, 在 rtspclient物件的刪除也加互斥鎖
void CloseClientFun(void *data)
{ 
	if (!data)
	{
		return;
	}
	RTSPClient* pClient=(RTSPClient*)data;
	shutdownStream(pClient,0);
}

int CStreamItem::Close()
{
	if (m_pRtspClient)
	{
		m_pRtspClient->m_lpStreamCallBack=NULL;
		m_pRtspClient->m_pUserData=NULL;
	
		WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);	
		theApp.g_scheduler->scheduleDelayedTask(1000*1000, CloseClientFun, m_pRtspClient);		
		ReleaseMutex(theApp.g_eventLoopMutex);
		
		m_pRtspClient=NULL;
	}
	return 0;	
}

客戶端開啟的程式碼 增加互斥鎖

WaitForSingleObject(theApp.g_eventLoopMutex,INFINITE);
m_pRtspClient->sendDescribeCommand(continueAfterDESCRIBE);	
ReleaseMutex(theApp.g_eventLoopMutex);
引起報錯的原因歸根結底還是 Live555 單執行緒機制