首页 > 其他分享 >live555 RTSPClient客户端修正多网卡多ip情况下解码器不能解码显示问题

live555 RTSPClient客户端修正多网卡多ip情况下解码器不能解码显示问题

时间:2023-09-08 18:34:44浏览次数:39  
标签:live555 name clientSock clientAddr 网卡 xx 解码器 addr


问题

海康NVR接入正常,但接入海康解码器出不来图像;

分析海康解码器是以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与解码器通信, 导致解码器没有收到数据;

解决问题:

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

在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信息,解码器即可正常解码显示;


标签:live555,name,clientSock,clientAddr,网卡,xx,解码器,addr
From: https://blog.51cto.com/u_16247540/7412149

相关文章

  • ubuntu服务器配置网卡bond
    一、网卡bond介绍通过把多个物理网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,具体的功能取决于采用的哪种模式。二、bond模式1、mode=0(balance-rr)(平衡抡循环策略)链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port......
  • 轻松实现Linux多网卡多网关同时工作
    实验目的由于Linux系统中只会生效一条默认网关,当同一台设备为多个网卡配置网关后只有一个网卡可以正常通讯。要使多个网关同时生效就需要配置路由策略才能使其生效。1.要求服务器的双网卡IP不同段,且都能被业务部访问到。2.AR1作为业务部的网关设备,负责连通业务部与服务器端的网络通......
  • 数据链路层设备-网卡和网桥
    数据链路层的设备有:网卡、网桥、交换机1网卡网卡(网络接口卡)网卡工作在数据链路层和物理层。其作用是将数据链路层的以太网报文变换成高低电平传输到物理层;将物理层到达的高低电平信号传输到数据链路层,数据链路层再进行以太网报文的组装。2网桥网桥是连接两个局域网的存......
  • 通过调整解码器参数,EasyPlayer.js可以实现H.265音频解码
    EasyPlayer是一款稳定且流畅的流媒体播放器,它能够支持H.264和H.265视频播放。该播放器能够处理各种视频流格式,包括RTSP、RTMP、HLS、FLV和WebRTC等。EasyPlayer具备多个版本,例如EasyPlayer-RTSP、EasyPlayer.js和EasyPlayerPro,以满足不同用户在不同场景下的需求。此外,EasyPlayer还......
  • ubuntu重启网卡的三种方法【转载】
    Linux重启网卡的三种方法:一、network利用root帐户#servicenetworkrestart或者/etc/init.d/networkingrestart二、ifdown/ifup#ifdowneth0#ifupeth0三、ifconfig#ifconfigeth0down#ifconfigeth0up Ubuntu14.04修改配置,重启网卡没有生效,出现如下问题:service......
  • Rocky_linux9网卡启动失败问题记录
    一、故障场景之前虚拟机一直是可以上网的,昨天正常关机后第二天开机网卡始终启动不了。开始排查问题查看网卡信息,发现获取不到IP地址查看网卡状态时发现处于未连接状态nmclicshow二、尝试启动网卡1)直接启用网卡nmclicupens37启动失败出现报错信息,连接激活失败,找不到适合此连接......
  • ubuntu22网卡绑定
    1.网卡绑定模式第⼀种模式:mod=0,即:(balance-rr)Round-robinpolicy(平衡抡循环策略)特点:传输数据包顺序是依次传输(即:第1个包⾛eth0,下⼀个包就⾛eth1….⼀直循环下去,直到最后⼀个传输完毕),此模式提供负载平衡和容错能⼒。第⼆种模式:mod=1,即:(active-backup)Active-backuppolicy......
  • 小米2平板ubuntu22.04.2 BCM4356无线网卡驱动问题的解决
    以下为你提供在Linux操作系统中BCM4356无线网卡驱动问题的解决方案,针对Ubuntu18.04和Deepinlinux15.8等Linux发行版。 前言目前很多新笔记本电脑的用的是BCM的无线网卡和蓝牙模块集成模块,比如华为MateBook、神舟PcPad、联想多型号,但安装各种最新版的Linux都无法驱动,网......
  • 剖析网卡绑定模式
    目前网卡绑定mode共有七种(0~6)bond0、bond1、bond2、bond3、bond4、bond5、bond6常用的有三种:mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定......
  • keepalived指定多个网卡设置vip
    添加vip地址(eth0和eth1)vrrp_instanceVI_1{stateMASTERinterfaceeth0virtual_router_id60priority100advert_int1authentication{auth_typePASSauth_pass1111}virtual_ipaddress{10.89.235.41/22......