基於live555的rtsp 客戶端模組優化
阿新 • • 發佈:2019-01-03
該模組支援多路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 單執行緒機制