基於live555的rtsp播放器:斷網重連

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章