l琅琊王 2025-05-06 17:35 采纳率: 50%
浏览 43

c/c++ exosip gb28181

          请教  c/c++ gb28181 解析invite回应时出现 eXosip_get_remote_sdp接口返回为空的问题

在linux下使用exosip2-5.3.0 libosip25.3.0实现从海康ipc 取视频流,Linux作为国标服务端实现与ipc客户端sip信令交互。再invite阶段,linux向ipc发起invite请求,ipc先回复了100 Ttring,然后紧接着回复了200 ok,并带了sdp信息。抓包显示,ipc回复的信息正常,sdp内容也正常。linux服务端解析回应时,也能解析到sdp的内容。但是linux解析时调用eXosip_get_remote_sdp却一直返回为空。
难受啊,为什么啊,能指导一下吗?

linux端解析代码如下

img

第710行一直返回空

抓包返回信息如下

img


IPC 返回100

img


IPC 返回200

linux解析输出如下

img

==================================================================

初次学习gb8181,能指导一下为什么eXosip_get_remote_sdp解析失败啊,不甚感激

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-06 19:15
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    eXosip_get_remote_sdp 返回空问题分析

    根据您提供的代码和问题描述,我分析了GB28181协议中eXosip_get_remote_sdp返回NULL的问题。

    问题分析

    1. 从抓包和日志看,IPC确实返回了200 OK和正确的SDP信息
    2. 代码中能获取到body内容,但eXosip_get_remote_sdp却返回NULL
    3. 可能的原因包括:
      • 会话ID(je->did)不正确
      • 上下文锁定/解锁问题
      • eXosip内部状态不一致

    解决方案

    1. 检查会话ID有效性

    // 在调用eXosip_get_remote_sdp前添加调试信息
    DEBUG_PRT("Current did: %d, ctx: %p\n", je->did, gb28181_ctx->ctx);
    
    // 检查会话是否存在
    int call_id = eXosip_call_get_id(gb28181_ctx->ctx, je->did);
    if (call_id < 0) {
        DEBUG_PRT("Invalid call did: %d\n", je->did);
        break;
    }
    

    2. 确保正确解析SDP

    // 尝试直接从消息体解析SDP
    if (body != NULL) {
        sdp_message_t *local_sdp = NULL;
        sdp_message_init(&local_sdp);
        if (sdp_message_parse(local_sdp, body->body) == 0) {
            DEBUG_PRT("Successfully parsed SDP locally\n");
            // 使用local_sdp进行后续处理
            sdp_message_free(local_sdp);
        }
    }
    

    3. 检查上下文锁定顺序

    确保在调用eXosip函数前正确锁定上下文:

    exosip_lock(gb28181_ctx->ctx);
    // 确保在锁定期间完成所有eXosip调用
    sdp_message_t *sdp_msg = eXosip_get_remote_sdp(gb28181_ctx->ctx, je->did);
    if (sdp_msg == NULL) {
        // 添加更多调试信息
        DEBUG_PRT("Failed to get remote SDP, last error: %d\n", eXosip_get_error());
    }
    eXosip_unlock(gb28181_ctx->ctx);
    

    4. 完整处理流程建议

    case EXOSIP_CALL_ANSWERED: {
        osip_body_t *body = NULL;
        osip_message_get_body(je->response, 0, &body);
        
        if (body == NULL) {
            DEBUG_PRT("No body in response\n");
            break;
        }
        
        DEBUG_PRT("Response body:\n%s\n", body->body);
        
        exosip_lock(gb28181_ctx->ctx);
        
        // 方法1: 使用eXosip接口获取SDP
        sdp_message_t *sdp_msg = eXosip_get_remote_sdp(gb28181_ctx->ctx, je->did);
        if (sdp_msg == NULL) {
            DEBUG_PRT("eXosip_get_remote_sdp failed, trying alternative method\n");
            
            // 方法2: 直接从消息体解析
            sdp_message_t *local_sdp = NULL;
            if (sdp_message_init(&local_sdp) == 0) {
                if (sdp_message_parse(local_sdp, body->body) == 0) {
                    DEBUG_PRT("Successfully parsed SDP locally\n");
                    // 使用local_sdp
                    sdp_message_free(local_sdp);
                }
            }
        } else {
            DEBUG_PRT("Got remote SDP successfully\n");
            // 处理sdp_msg
        }
        
        eXosip_unlock(gb28181_ctx->ctx);
        break;
    }
    

    可能的问题根源

    1. 会话状态不同步:eXosip内部可能没有正确更新会话状态
    2. SDP格式问题:虽然看起来正确,但可能有细微格式问题导致解析失败
    3. 版本兼容性问题:eXosip 5.3.0可能有特定行为

    进一步调试建议

    1. 检查eXosip版本是否有已知的类似问题
    2. 尝试使用更新的eXosip版本(如5.4.0)
    3. 在调用eXosip_get_remote_sdp前后添加更多调试信息
    4. 检查IPC返回的SDP是否完全符合RFC规范

    希望这些建议能帮助您解决问题。如果问题仍然存在,建议提供更完整的日志和抓包数据以便进一步分析。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月6日