有没有办法从回调函数或类似 PJSUA2 库中获取媒体属性,它是 SDP 主体的一部分?
我正在寻找一种方法来获取在 SIP 邀请请求中发送的远程媒体端口和 IP 地址。
我知道如何为来电注册回调,但是,afaik,该回调不包括有关远程方的任何信息。
当然有一种方法可以做到这一点。例如on_call_media_state
回调:
- 包括pjsua_internal头文件:
#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 才能获得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();
};