天天看點

Live555 的斷網重連問題

點選打開連結

1)重連死鎖

1.1)重連時如果将解碼回調線程放在NetSdk裡面,使用兩個Event,當接受線程結束時,發送接受線程結束的信号,然後在解碼線程裡面判斷接收線程信号 ,如果有信号,就發送一個退出解碼線程,發送一個解碼結束的信号;

1.2)當逾時重連時,首先Stop碼流,然後Restart碼流;停止碼流時,将eventLoopWatchVariable=1;讓資料接收線程順利退出;同時在stop函數裡面等待解碼線程結束,

WaitForThreadExit(m_DecodeExitEvent);

這時會造成死鎖;因為Live555是單線程的,在逾時函數中需要等待本線程的結束,造成死鎖;

解決辦法:

1)使用單獨的心跳線程來實作重連功能或者在回調資料給用戶端的的解碼線程裡面實作重連功能;

2)網絡斷開判斷方法 使用延遲隊列來判斷,初始化時候調用noteLiveness,然後每次收到Sink的一幀資料時,再次調用noteLiveness,這樣如果網絡斷開,逾時後,就能判斷出來;在資料接收線程的doEventLoop後面将重連标記置位:

    m_bReConnect=true;

3)斷網重連的工作不能放在livenessTimeoutTask這個函數裡面,不然會造成重連死鎖,因為live555是單線程的;隻能放在其它的線程裡面實作重連;我是放在回調給用戶端的解碼線程裡面實作重連;

繼續閱讀