如何在 pjsua2 中从 SDP 正文获取媒体属性?



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

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

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

当然有一种方法可以做到这一点。例如on_call_media_state回调:

  1. 包括pjsua_internal头文件:#include <pjsua-lib/pjsua_internal.h>
  2. 从回调的参数中获取pjsua_callcall_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];
    }
    

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

希望对您有所帮助!

DaszuOne的好建议! 这是复制SDP地址:端口的完整工作片段,如果有多个媒体,则以逗号分隔(需要 #include 才能获得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();
};

相关内容

  • 没有找到相关文章

最新更新