在pjsip 2.6的pjproject-2.6\pjsip-apps\src\pjsua 目录下,有个很好的例子,可以拨打单方通话和多方通话。
示例在:pjsua_app_cli.c里面static pj_status_t cmd_make_multi_call(pj_cli_cmd_val *cval)函数中。
多方通话的逻辑和单独拨打一个电话的逻辑是一样的,只是拨打一个电话,调用一次pjsua_call_make_call,而多方通话多次调用该接口,拨出多个电话。另外,在on_call_media_state中主要connect port,否则是听不到声音的。
拨打多方通话的代码:
for (i=0; i<count; ++i) {
pj_status_t status;
status = pjsua_call_make_call(current_acc, &tmp, &call_opt, NULL, NULL, NULL);
if (status != PJ_SUCCESS)
break;
}
connect port的方法:
比如A 先打电话给B,在打电话给C,进行3方通话,正常情况下,
A和B通话是这样连接:
static void on_call_media_state(pjsua_call_id call_id)
{
pjsua_call_info AandB;
pjsua_call_get_info(call_id, &AandB);
if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
// When media is active, connect call to sound device.
pjsua_conf_connect(AandB.conf_slot, 0);
pjsua_conf_connect(0, AandB.conf_slot);
}
}
A和C通话是这样连接:
static void on_call_media_state(pjsua_call_id call_id)
{
pjsua_call_info AandC;
pjsua_call_get_info(call_id, &AandC);
if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
// When media is active, connect call to sound device.
pjsua_conf_connect(AandC.conf_slot, 0);
pjsua_conf_connect(0, AandC.conf_slot);
}
}
上面这样链接后,A可以和B/C通话,但是B和C互相听不到对方的声音。
需要加入下面的步骤,这个可以在A和C的on_call_media_state调用后,在加入下面的两个connect:
pjsua_conf_connect(AandB.conf_slot, AandC.conf_slot);
pjsua_conf_connect(AandC, AandB.conf_slot);
这样A/B/C互相之间,都会听到对方的声音了。