天天看点

pjsip 多方通话

在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互相之间,都会听到对方的声音了。