StreamingServer 接入海康NVR 和 解码器

StreamingServer 接入海康NVR 和 解码器

背景

之前实现了StreamingServer 接入海康NVR; 以 rtp over tcp 的方式接入, 一切正常;
接入了海康NVR后,觉得接入海康解码器应该是理所当然的, 毕竟同一家的产品. 但结果… 黑屏…

接入海康NVR

注意事项: 必须将sps、pps、关键帧数据分开发送,否则海康解码器只能接收但不解码显示;

接入海康解码器:

海康解码器是以rtp over udp的方式进行取流;
如果运行streamingServer的PC, 网络设置为以下两种情况,则都可以正常上墙显示:
1. 本机仅设置一个IP, 且和解码器在同一网段;
2. 本机有两个IP, 如192.168.xx.xx 和 190.168.xx.xx, 解码器网段为190.168.xx.xx;

当同一网卡设置了以下不同网段的IP,则会出现解码器不能解码上墙的问题,如:
192.168.100.8
192.168.5.8
190.168.100.1
190.168.12.8

经过分析, 在setupDatagramSocket函数中, bind时填写的地址为0.0.0.0, 而本机中有多个ip, 猜想是因为在发送udp数据时,系统随机选用一个ip与解码器通信, 导致解码器没有收到数据;

解决方法

在setupDatagramSocket函数中增加参数 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;
    }
    ...
}

在调用setupDatagramSocket的地方全都加上int clientSock, 并在入口处将其传入;

注意事项

在sdp信息中,可将sprop-parameter-sets为空,如下:
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:1048576
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;sprop-parameter-sets=
a=control:track1

当sprop-parameter-sets为空时,只要在后面的rtp包中发送了sps,pps信息,解码器即可正常解码显示;

说明

StreamingServer为调用Demo. 实现了对rtsp流的拉流和转发;

windows: 双击streamingserver.exe 即可;
linux: 设置动态库加载路径, 在终端中运行streamingserver即可;
当前支持对rtsp协议的相机进行拉流并转发;
客户端访问地址: rtsp://192.168.1.100:8555/rtsp://admin:[email protected]/ch1
前面的192.168.1.100为运行streamingserver的IP;
后面的rtsp://admin:[email protected]/ch1为摄像机的URL;

下载地址: https://pan.baidu.com/s/1aOsO42h49ez55tIPQUFVkw

交流QQ: 760983740

你可能感兴趣的:(live555)