pjsip windows demo编译运行 (pjsip 2.9 qt环境)

1、编译参考 https://www.cnblogs.com/GYY2046/p/11455747.html

编译完成后在pjsip2.9/lib下产生一个libpjproject-i386-Win32-vc14-Debug.lib 就是所有的lib 

2、创建qt gui 程序 在 lib 和include 导入lib 和头文件

pjsip windows demo编译运行 (pjsip 2.9 qt环境)

ffmpeg和sdk的都在incude目录

pjsip的需要导入的参考

pjsip windows demo编译运行 (pjsip 2.9 qt环境)

pjsip windows demo编译运行 (pjsip 2.9 qt环境)

3、将这些考入include下

pjsip windows demo编译运行 (pjsip 2.9 qt环境)

4、最后vs项目配置lib 和include

 也可以参考vidgui写 也可参考pjsip-apps\src\samples 下的pjsua2_demo.cpp 或者simple_pjsua.c

5、创建一个qt thread 导入lib


#include <pjsua2.hpp>

#include <sdl/SDL.h>

#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avdevice.lib")
#pragma comment(lib, "avfilter.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "postproc.lib")
#pragma comment(lib, "swresample.lib")
#pragma comment(lib, "swscale.lib")

#pragma comment(lib, "libpjproject-i386-Win32-vc14-Debug.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "dsound.lib")  
#undef main
 
using namespace pj;

这个是c++的

c的去掉using namespace pj;和#include <pjsua2.hpp>改成pjsip.h

线程不能停掉

 void run(){

pjsua_acc_id acc_id;
    pj_status_t status;

    /* Create pjsua first! */
    status = pjsua_create();
    if (status != PJ_SUCCESS) error_exit("Error in pjsua_create()", status);

    /* If argument is specified, it's got to be a valid SIP URL */
    if (argc > 1) {
    status = pjsua_verify_url(argv[1]);
    if (status != PJ_SUCCESS) error_exit("Invalid URL in argv", status);
    }

    /* Init pjsua */
    {
    pjsua_config cfg;
    pjsua_logging_config log_cfg;

    pjsua_config_default(&cfg);
    cfg.cb.on_incoming_call = &on_incoming_call;
    cfg.cb.on_call_media_state = &on_call_media_state;
    cfg.cb.on_call_state = &on_call_state;

    pjsua_logging_config_default(&log_cfg);
    log_cfg.console_level = 4;

    status = pjsua_init(&cfg, &log_cfg, NULL);
    if (status != PJ_SUCCESS) error_exit("Error in pjsua_init()", status);
    }

    /* Add UDP transport. */
    {
    pjsua_transport_config cfg;

    pjsua_transport_config_default(&cfg);
    cfg.port = 5060;
    status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &cfg, NULL);
    if (status != PJ_SUCCESS) error_exit("Error creating transport", status);
    }

    /* Initialization is done, now start pjsua */
    status = pjsua_start();
    if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status);

    /* Register to SIP server by creating SIP account. */
    {
    pjsua_acc_config cfg;

    pjsua_acc_config_default(&cfg);
    cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN);
    cfg.reg_uri = pj_str("sip:" SIP_DOMAIN);
    cfg.cred_count = 1;
    cfg.cred_info[0].realm = pj_str(SIP_DOMAIN);
    cfg.cred_info[0].scheme = pj_str("digest");
    cfg.cred_info[0].username = pj_str(SIP_USER);
    cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
    cfg.cred_info[0].data = pj_str(SIP_PASSWD);

    status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id);
    if (status != PJ_SUCCESS) error_exit("Error adding account", status);
    }

    /* If URL is specified, make call to the URL. */
    if (argc > 1) {
    pj_str_t uri = pj_str(argv[1]);
    status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL);
    if (status != PJ_SUCCESS) error_exit("Error making call", status);
    }

while (!exit)
{ sleep(1);//1s
        if (callurl != "") {

          //call.....

         callurl =“”;

       }

}

on_error:
    pjsua_destroy();

}

7、安卓参考:

https://blog.csdn.net/Java_lilin/article/details/89212406

交流 

群261074724