接口调用简单、多平台支持的RTSP-Server组件EasyRTSPServer如何修正多网卡多IP情况下解码器不能解码显示问题
EasyRTSPServer修正多網(wǎng)卡多IP情況下解碼器不能解碼顯示問題
提出問題:
海康NVR接入正常,但接入海康解碼器出不來圖像。
分析問題:
海康解碼器是以rtp over udp的方式進行取流,如果運行streamingServer的PC,網(wǎng)絡(luò)設(shè)置為以下兩種情況,則都可以正常上墻顯示 :
當同一網(wǎng)卡設(shè)置了以下不同網(wǎng)段的IP,則會出現(xiàn)解碼器不能解碼上墻的問題,如:
192.168.100.8
192.168.5.8
190.168.100.1
190.168.12.8
經(jīng)過分析,在setupDatagramSocket函數(shù)中,bind時填寫的地址為0.0.0.0,而本機中有多個ip,猜想是因為在發(fā)送udp數(shù)據(jù)時,系統(tǒng)隨機選用一個ip與解碼器通信,導(dǎo)致解碼器沒有收到數(shù)據(jù)。
解決問題:
注: 必須將sps、pps、關(guān)鍵幀數(shù)據(jù)分開發(fā)送,否則海康解碼器只能接收但不解碼顯示;
在setupDatagramSocket函數(shù)中增加參數(shù) int clientSock, 用于獲取當前解碼器和streamingserver通信的ip, 將其綁定, 如下:
int setupDatagramSocket(UsageEnvironment& env, Port port, int clientSock, LIVE_IP_VER_ENUM ipVer) {...MAKE_SOCKADDR_IN(name, addr.sin_addr.s_addr, port.num());if (clientSock > 0){int nSize = sizeof(struct sockaddr_in);struct sockaddr_in clientAddr;memset(&clientAddr, 0x00, sizeof(clientAddr));getsockname(clientSock, (struct sockaddr*)&clientAddr, &nSize);memcpy(&name.sin_addr, &clientAddr.sin_addr, sizeof(name.sin_addr));}if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) {char tmpBuffer[100];sprintf(tmpBuffer, "bind() error (port number: %d): ",ntohs(port.num()));socketErr(env, tmpBuffer);closeSocket(newSocket);return -1;}... }在調(diào)用setupDatagramSocket的地方全都加上int clientSock, 并在入口處將其傳入;
注意事項:
在sdp信息中,可將sprop-parameter-sets為空,如下:
當sprop-parameter-sets為空時,只要在后面的rtp包中發(fā)送了sps,pps信息,解碼器即可正常解碼顯示;
總結(jié)
以上是生活随笔為你收集整理的接口调用简单、多平台支持的RTSP-Server组件EasyRTSPServer如何修正多网卡多IP情况下解码器不能解码显示问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 合并多个Excel (表头
- 下一篇: swift5基本语法-Self 与sel