Sip 如何从pjsua2中的SDP主体获取媒体属性?
有没有办法从回调函数或类似的PJSUA2库中获取媒体属性(SDP主体的一部分) 我正在寻找一种方法来获取SIP INVITE请求中发送的远程媒体端口和IP地址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=
我知道如何为传入呼叫注册回调,但是,恕我直言,该回调不包括有关远程方的任何信息。当然有办法做到这一点。例如,在
on\u call\u media\u状态下
callback:
#include
pjsua\u call
结构指针:pjsua\u call*call=&pjsua\u var.calls[call\u id]代码>
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();
};