Sip 如何从pjsua2中的SDP主体获取媒体属性?

Sip 如何从pjsua2中的SDP主体获取媒体属性?,sip,voip,pjsip,sdp,pjsua2,Sip,Voip,Pjsip,Sdp,Pjsua2,有没有办法从回调函数或类似的PJSUA2库中获取媒体属性(SDP主体的一部分) 我正在寻找一种方法来获取SIP INVITE请求中发送的远程媒体端口和IP地址 我知道如何为传入呼叫注册回调,但是,恕我直言,该回调不包括有关远程方的任何信息。当然有办法做到这一点。例如,在on\u call\u media\u状态下callback: include pjsua_内部头文件:#include 使用回调参数中的call\u id获取pjsua\u call结构指针:pjsua\u call*call=

有没有办法从回调函数或类似的PJSUA2库中获取媒体属性(SDP主体的一部分)

我正在寻找一种方法来获取SIP INVITE请求中发送的远程媒体端口和IP地址


我知道如何为传入呼叫注册回调,但是,恕我直言,该回调不包括有关远程方的任何信息。

当然有办法做到这一点。例如,在
on\u call\u media\u状态下
callback:

  • include pjsua_内部头文件:
    #include
  • 使用回调参数中的call\u id获取
    pjsua\u call
    结构指针:
    pjsua\u call*call=&pjsua\u var.calls[call\u id]
  • 现在您可以读取当前的本地和远程SDP:

    const pjmedia_sdp_session *remote_sdp;
    const pjmedia_sdp_session *local_sdp;
    pj_status_t status = pjmedia_sdp_neg_get_active_remote(call->inv->neg, &remote_sdp);
    pj_status_t status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &local_sdp);
    for (int i = 0; i < remote_sdp->media_count; i++) {
        // structure with access to SDP m values
        pjmedia_sdp_media *m = remote_sdp->media[i];
    }
    
    const pjmedia_sdp_session*remote_sdp;
    const pjmedia_sdp_session*local_sdp;
    pj_status_t status=pjmedia_sdp_neg_get_active_remote(call->inv->neg,&remote_sdp);
    pj_status_t status=pjmedia_sdp_neg_get_active_local(call->inv->neg,&local_sdp);
    对于(int i=0;imedia\u count;i++){
    //可访问SDP m值的结构
    pjmedia_sdp_media*m=远程_sdp->media[i];
    }
    
  • 我没有运行此代码,但它应该可以工作


    希望这对你有帮助

    DaszuOne的绝妙建议! 下面是复制SDP地址的完整工作片段:所有媒体的端口,如果有多个,则以逗号分隔(需要#include以获取SDP协商状态)

    void MyCall::onCallState(oncallstateparm&prm){
    CallInfo ci=getInfo();
    pjsua_call*call=&pjsua_var.calls[ci.id];
    如果(调用->inv->neg&&pjmedia_sdp_neg_get_state(调用->inv->neg)==pjmedia_sdp_neg_state_DONE){
    字符串remote_addr=“”;
    const pjmedia_sdp_session*remote_sdp;
    if(PJ_SUCCESS==pjmedia_sdp_neg_get_active_remote(call->inv->neg,&remote_sdp)){
    对于(int i=0;imedia\u count;i++){
    如果(i>0)
    远程地址追加(“,”);
    pjmedia_sdp_media*m=远程_sdp->media[i];
    远程地址追加(字符串(m->conn->addr.ptr,m->conn->addr.slen));
    远程地址附加(“:”);
    远程地址追加(到字符串(m->desc.port));
    }
    }否则{
    远程地址=”;
    }
    callstate->othermedia=远程地址;
    字符串local_addr=“”;
    const pjmedia_sdp_session*local_sdp;
    if(PJ_SUCCESS==pjmedia_sdp_neg_get_active_local(call->inv->neg,&local_sdp)){
    对于(int i=0;imedia\u count;i++){
    如果(i>0)
    本地地址附加(“,”);
    pjmedia_sdp_media*m=local_sdp->media[i];
    本地地址追加(字符串(m->conn->addr.ptr,m->conn->addr.slen));
    本地地址附加(“:”);
    本地地址追加(到字符串(m->desc.port));
    }
    }否则{
    本地地址=”;
    }
    callstate->mymedia=local\u addr;
    }
    callstate->stateText=ci.stateText;
    callstate->update();
    };
    
    void MyCall::onCallState(OnCallStateParam &prm) {
        CallInfo ci = getInfo();
        pjsua_call *call = &pjsua_var.calls[ci.id];
    
        if(call->inv->neg && pjmedia_sdp_neg_get_state(call->inv->neg) == PJMEDIA_SDP_NEG_STATE_DONE){
            string remote_addr="";
            const pjmedia_sdp_session *remote_sdp;
            if(PJ_SUCCESS==pjmedia_sdp_neg_get_active_remote(call->inv->neg, &remote_sdp)){
                for (int i = 0; i < remote_sdp->media_count; i++) {
                    if(i>0)
                        remote_addr.append(",");
                    pjmedia_sdp_media *m = remote_sdp->media[i];
                    remote_addr.append(string(m->conn->addr.ptr,m->conn->addr.slen));
                    remote_addr.append(":");
                    remote_addr.append(to_string(m->desc.port));
                }
            }else{
                remote_addr="<none>";
            }
            callstate->othermedia = remote_addr;
    
            string local_addr="";
            const pjmedia_sdp_session *local_sdp;
            if(PJ_SUCCESS==pjmedia_sdp_neg_get_active_local(call->inv->neg, &local_sdp)){
                for (int i = 0; i < local_sdp->media_count; i++) {
                    if(i>0)
                        local_addr.append(",");
                    pjmedia_sdp_media *m = local_sdp->media[i];
                    local_addr.append(string(m->conn->addr.ptr,m->conn->addr.slen));
                    local_addr.append(":");
                    local_addr.append(to_string(m->desc.port));
                }
            }else{
                local_addr="<none>";
            }
            callstate->mymedia = local_addr;
        }
    
        callstate->stateText = ci.stateText;
        callstate->update();
    };