2

我需要开发使用标准 SIP 协议但使用自定义协议来处理媒体的 SIP 客户端。

当我尝试发送 INVITE 时,我从 pjsip lib 收到一条错误消息,并且没有发送数据包。错误是:

初始化媒体通道时出错 (PJ_EBUSY)

初始化lib的代码是:

        pjsua_config cfg = new pjsua_config();

        // SERVICE CONFIG
        if (userAgentReceiver == null) {
            userAgentReceiver = new UAStateReceiver();
            userAgentReceiver.initService();
        }
        userAgentReceiver.reconfigure();

        pjsua.setCallbackObject(userAgentReceiver);

        // MAIN CONFIG
        pjsua.config_default(cfg);
        cfg.setCb(pjsuaConstants.WRAPPER_CALLBACK_STRUCT);
        cfg.setUser_agent(pjsua.pj_str_copy("test"));
        // We need at least one thread
        int threadCount =  1;

        cfg.setThread_cnt(threadCount);
        cfg.setUse_srtp(pjmedia_srtp_use.PJMEDIA_SRTP_DISABLED);
        cfg.setSrtp_secure_signaling(0);
        cfg.setNat_type_in_sdp(0);

        pjsip_timer_setting timerSetting = cfg.getTimer_setting();
        int minSe = 100;
        int sessExp = 1000;

        if (minSe <= sessExp && minSe >= 90) {
            timerSetting.setMin_se(minSe);
            timerSetting.setSess_expires(sessExp);
            cfg.setTimer_setting(timerSetting);
        }

        // LOGGING CONFIG          
        pjsua_logging_config logCfg = new pjsua_logging_config();
        logCfg.setConsole_level(1);
        logCfg.setLevel(1);
        logCfg.setMsg_logging(pjsuaConstants.PJ_TRUE);            
        pjsua.logging_config_default(logCfg);

        // MEDIA CONFIG
        pjsua_media_config mediaCfg = new pjsua_media_config();
        mediaCfg.setEnable_ice(pjsuaConstants.PJ_FALSE);
        mediaCfg.setEnable_turn(pjsuaConstants.PJ_FALSE);    
        mediaCfg.setHas_ioqueue(pjsuaConstants.PJ_FALSE);
        mediaCfg.setIce_no_rtcp(0);
        mediaCfg.setMax_media_ports(0);
        mediaCfg.setChannel_count(0);
        pjsua.media_config_default(mediaCfg);

        csipsimple_config cssCfg = new csipsimple_config(); 
        pjsua.csipsimple_config_default(cssCfg);
        // INITIALIZE
        status = pjsua.csipsimple_init(cfg, logCfg, mediaCfg, cssCfg, context);
        if (status != pjsuaConstants.PJ_SUCCESS) {
            cleanPjsua();
            return false;
        }

注册代码(成功)是:

int[] accId = new int[1];
    accId[0] = 1;

    pjsua_acc_config cfg = new pjsua_acc_config();
    pjsua.acc_config_default(cfg);
    csipsimple_acc_config css_cfg = new csipsimple_acc_config();
    pjsua.csipsimple_acc_config_default(css_cfg);

    cfg.setPriority(100);
    cfg.setId(pjsua.pj_str_copy("sip:" + sipUser + "@" + sipServer));
    cfg.setReg_uri(pjsua.pj_str_copy("sip:" + sipServer));
    cfg.setReg_timeout(60);
    cfg.setCred_count(1);

    cfg.setUse_rfc5626(pjsuaConstants.PJ_TRUE);
    cfg.setReg_delay_before_refresh(60);
    cfg.setPublish_enabled(0);

    pjsua_transport_config cfgTrasport = new pjsua_transport_config();      
    int[] tId = new int[1];
    int status;
    pjsua.transport_config_default(cfgTrasport);
    cfgTrasport.setPort(5060);
    status = pjsua.transport_create(pjsip_transport_type_e.PJSIP_TRANSPORT_UDP, cfgTrasport, tId);
    if (status != pjsuaConstants.PJ_SUCCESS) {
        Platform.errorLog("pjsua.transport_create returned status="+status);
    }

    pjsip_cred_info cred_info = cfg.getCred_info();
    cred_info.setRealm(pjsua.pj_str_copy(sipServer));
    cred_info.setScheme(pjsua.pj_str_copy("digest"));
    cred_info.setUsername(pjsua.pj_str_copy(sipUser));
    cred_info.setData_type(pjsip_cred_data_type.PJSIP_CRED_DATA_PLAIN_PASSWD.swigValue());
    cred_info.setData(pjsua.pj_str_copy(password));
    cfg.setKa_interval(40);

    pjsua.csipsimple_set_acc_user_data(cfg, css_cfg);
    status = pjsua.acc_add(cfg, pjsuaConstants.PJ_FALSE, accId);
    if (status == pjsuaConstants.PJ_SUCCESS) {
        status = pjsua.acc_set_online_status(accId[0], 1);
        Platform.infoLog("acc_set_online_status returned stauts="+status);
    } else {
        Platform.infoLog("Error status=" + status);
    }

这是我的邀请码:

    pjsua.set_no_snd_dev();
    pj_str_t uri = pjsua.pj_str_copy(callee);

    // Nothing to do with this values
    byte[] userData = new byte[1];
    int[] callId = new int[1];
    pjsua_call_setting cs = new pjsua_call_setting();
    pjsua_msg_data msgData = new pjsua_msg_data();

    // Call settings to add video
    pjsua.call_setting_default(cs);
    cs.setFlag(0);

    // Msg data to add headers
    pjsua.msg_data_init(msgData);

    int status = pjsua.call_make_call(accountId, uri, cs, userData, msgData, callId);

你能看出有什么问题吗?

4

1 回答 1

3

愚蠢的事情:我需要打电话

pjsua.start()
于 2013-05-14T11:14:07.670 回答