有没有办法从回调函数或与 PJSUA2 库类似的函数中获取媒体属性,它是 SDP 主体的一部分?
我正在寻找一种方法来获取在 SIP INVITE 请求中发送的远程媒体端口和 IP 地址。
我知道如何为来电注册回调,但是,afaik,该回调不包含有关远程方的任何信息。
当然有办法做到这一点。例如在on_call_media_state
回调中:
#include <pjsua-lib/pjsua_internal.h>
pjsua_call
使用回调参数中的 call_id获取结构指针:pjsua_call *call = &pjsua_var.calls[call_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];
}
我没有运行此代码,但它应该可以工作。
希望对您有所帮助!
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();
};