【gb28181问题】eXosip_get_remote_sdp返回空的解决办法

12 篇文章 ¥19.90 ¥99.00
在开发GB28181客户端时遇到eXosip_get_remote_sdp返回空的状况,导致无法预览视频流。可能的原因包括服务端SDP为空或格式错误,以及解析错误。通过Wireshark抓包确认问题,并在自动化测试工具中发现设备ID和通道ID设置不正确。解决方案是确保设备ID和通道ID设置符合GB28181服务器规则,从而获取正确的SDP信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


eXosip_get_remote_sdp返回空的解决办法

问题描述

当使用exosip开发GB28181客户端时,与服务器连接进行实时视频预览时,发现调用eXosip_get_remote_sdp返回为空,无法正确进行预览到视频流,
而正确应该解析出如下SDP信息:
在这里插入图片描述

问题分析

以下可能是出现的情况:

1、28181服务端发送SDP为空
wireshake抓包确定
2、28181服务端发送SDP格式不对
wireshake抓包确定
3、其它解析错误

问题复现

以下是GB2818自动化测试工具出现的问题:
1)设备ID和通道ID设置一样
在这里插入图片描述
2)
实时视频预览是会出现如下问题:

在基于GBT28181的SIP协议组件开发中,SIP事件处理是非常重要的一环。本文将介绍如何使用eXosip2实现SIP事件处理流程。 eXosip2是一个基于SIP协议的开源软件,它提供了一个简单易用的SIP协议栈,并且支持SIP的基本功能,例如注册、呼叫、媒体处理等。在eXosip2中,SIP事件处理是通过回调函数实现的。 下面是eXosip2的SIP事件处理流程: 1. 初始化eXosip2 在使用eXosip2之前,需要先进行初始化操作。可以通过以下代码实现: ``` osip_mutex_init (); osip_cond_init (); osip_udp_init (0); osip_tcp_init (0); osip_tls_init (0); eXosip_init (); ``` 2. 注册SIP 在eXosip2中,注册SIP是通过eXosip_register_build()函数实现的。该函数会生成一个REGISTER请求,并且通过eXosip_register_send()函数发送该请求。在注册成功后,eXosip2会调用注册成功的回调函数。 以下是注册SIP的示例代码: ``` char *server_ip = "192.168.1.100"; char *username = "test"; char *password = "123456"; char *realm = "example.com"; osip_message_t *reg = NULL; int reg_id = -1; reg_id = eXosip_register_build_request (reg, "REGISTER", server_ip, NULL, NULL); osip_message_set_supported_header (reg, "path"); osip_message_set_supported_header (reg, "eventlist"); osip_message_set_supported_header (reg, "gruu"); osip_message_set_supported_header (reg, "sip.instance"); eXosip_lock (); eXosip_register_send_request (reg_id, reg); eXosip_unlock (); osip_message_free (reg); ``` 3. 处理SIP事件 在eXosip2中,SIP事件是通过回调函数处理的。例如,当收到INVITE请求时,eXosip2会调用INVITE请求的回调函数。以下是INVITE请求的回调函数示例代码: ``` int on_invite_recv (osip_event_t *evt) { osip_message_t *invite = NULL; int call_id = -1; char *remote_ip = NULL; int remote_port = -1; char *local_sdp = NULL; call_id = eXosip_event_get_id (evt); remote_ip = eXosip_event_get_remote_ip (evt); remote_port = eXosip_event_get_remote_port (evt); osip_message_init (&invite); osip_message_parse (invite, eXosip_event_get_request (evt)); local_sdp = "v=0\r\no=root 1 1 IN IP4 192.168.1.100\r\ns=session\r\nc=IN IP4 192.168.1.100\r\nt=0 0\r\nm=audio 7078 RTP/AVP 0 8 101\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\n"; eXosip_lock (); eXosip_call_build_answer (call_id, 200, &invite); eXosip_call_send_answer (call_id, local_sdp, strlen (local_sdp)); eXosip_unlock (); osip_message_free (invite); return OSIP_SUCCESS; } ``` 在上述示例代码中,当收到INVITE请求时,通过eXosip_event_get_request()函数获取INVITE请求,并通过osip_message_parse()函数解析该请求。然后,生成一个200 OK的响应,并通过eXosip_call_send_answer()函数发送该响应。 4. 清理eXosip2 在使用完eXosip2后,需要对它进行清理操作。可以通过以下代码实现: ``` eXosip_quit (); osip_tls_deinit (); osip_tcp_deinit (); osip_udp_deinit (); osip_cond_deinit (); osip_mutex_deinit (); ``` 总结 通过以上介绍,我们了解了如何使用eXosip2实现SIP事件处理流程。在实际开发中,可以根据需要对eXosip2进行定制,以满足特定的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

废人一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值