live555原生不支持斷網重連,需要客戶端自己實現。
我的實現方法是,在sendPlayCommand的回調函數中啓動超時處理函數,函數中通過延時任務每秒鐘調用自己一次,並累加檢測次數值,當檢測次數達到超時時間時,認爲網絡異常,釋放所有live555資源,並重啓會話。在音視頻數據接收時,需要調用網絡檢測函數,該函數中重置檢測次數值爲0,這樣的話,當接收不到數據時,檢測次數值就會一直累加。
下面是超時處理函數:
void networkTimeoutHandler(void *clientData)
{
QHRtspClient *rtspClient = (QHRtspClient*)clientData;
QHRtspSession *rtspSession = rtspClient->rtspSession();
UsageEnvironment &env = rtspClient->envir();
QHRtspState &rtspState = rtspClient->rtspState();
if(rtspState.checkCount==15)
{
env << "network disconnected,reconnecting now...\n";
if(rtspState.networkTimeoutTask)
{
env.taskScheduler().unscheduleDelayedTask(rtspState.networkTimeoutTask);
rtspState.networkTimeoutTask=nullptr;
}
rtspState.checkCount=0;
rtspSession->restartSession();
}
rtspState.checkCount++;
rtspState.networkTimeoutTask=env.taskScheduler().scheduleDelayedTask(1*1000000, (TaskFunc*)networkTimeoutHandler, rtspClient);
}
下面是網絡檢測函數:
void QHRtspSession::checkNetworkConnection()
{
QHRtspState &rtspState = ((QHRtspClient*)m_rtspClient)->rtspState();
rtspState.checkCount=0;
}
原創不易,轉載請標明出處:https://blog.csdn.net/caoshangpa/article/details/112128800