0

有没有办法从回调函数或与 PJSUA2 库类似的函数中获取媒体属性,它是 SDP 主体的一部分?

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

我知道如何为来电注册回调,但是,afaik,该回调不包含有关远程方的任何信息。

4

2 回答 2

1

当然有办法做到这一点。例如在on_call_media_state回调中:

  1. 包括 pjsua_internal 头文件:#include <pjsua-lib/pjsua_internal.h>
  2. pjsua_call使用回调参数中的 call_id获取结构指针:pjsua_call *call = &pjsua_var.calls[call_id];
  3. 现在您可以读取当前的本地和远程 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];
    }
    

我没有运行此代码,但它应该可以工作。

希望对您有所帮助!

于 2019-10-24T08:06:38.123 回答
0

DaszuOne 的绝妙建议!这是复制 SDP 地址的完整工作片段:所有媒体的端口,如果超过一个,则用逗号分隔(需要 #include <pjmedia/sdp_neg.h> 以获得 SDP 协商状态)

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();
};
于 2021-01-26T04:52:04.600 回答