天天看點

EasyPlayer-rtsp 如何配置向Server發送心跳資訊?

EasyPlayer播放器系列已經支援了H265編碼視訊的播放,根據使用者在不同場景下的不同需求,我們已經有EasyPlayer-RTSP、EasyPlayer- RTMP、EasyPlayerPro 和EasyPlayer.js 等版本。

近期遇到一個客戶在用EasyPlayer-rtsp WIN版本播放器播放雄邁的一款錄影機,起播後約30秒就不出流了,導緻播放器無法正常工作;

EasyPlayer-rtsp 如何配置向Server發送心跳資訊?

經與客戶溝通,發現一個可以複現的情況,就是每次起播後都是約30秒不能播放,或者斷開後重新起播又可以播30秒,初步推斷應該是保活機制的問題;帶着猜測嘗試修複這個問題;大家都知道EasyPlayer-rtsp播放器底層是依賴EasyRTSPClient實作的拉流,打開拉流動作接口如下:

/* 打開網絡流 */
Easy_API int Easy_APICALL EasyRTSP_OpenStream(Easy_RTSP_Handle handle, int _channelid, char *_url, EASY_RTP_CONNECT_TYPE _connType, unsigned int _mediaType, char *_username, char *_password, void *userPtr, int _reconn/*1000表示長連接配接,即如果網絡斷開自動重連, 其它值為連接配接次數*/, int outRtpPacket/*預設為0,即回調輸出完整的幀, 如果為1,則輸出RTP包*/, int heartbeatType/*0x00:不發送心跳 0x01:OPTIONS 0x02:GET_PARAMETER*/, int _verbosity/*日志列印輸出等級,0表示不輸出*/);

EasyRTSPClient在設計之初就已經定義了相關指令互動的設計,看上面函數中 heartbeatType參數定義:

int heartbeatType/*0x00:不發送心跳 0x01:OPTIONS 0x02:GET_PARAMETER*

當給heartbeatType傳1時,會定時向Server發送心跳資訊;

再遇到此類RTSPSERVER需要Session保活檢測機制的時候,我們需要将heartbeatType參數值傳1。

不過此處值得注意的是,并不是所有的RTSPServer都做的那麼好,就比如海康的某些IPC/NVR型号,當RTSPClient在拉流的過程中,突然發送OPTIONS保活封包,就像是發送了一個垃圾資料一樣,RTSPServer自動就将整條RTSP連接配接斷開了,導緻RTP取流也随着停止了,我們隻能在這類裝置中,選擇不發送OPTIONS保活包。