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 和頭文件
ffmpeg和sdk的都在incude目錄
pjsip的需要導入的參考
3、將這些考入include下
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
}
on_error:
pjsua_destroy();
}
7、
如果你覺得麻煩可以去 https://item.taobao.com/item.htm?id=618486196283
sip服務器搭建可參考:https://blog.csdn.net/Java_lilin/article/details/103063930
pjsip java 參考:https://blog.csdn.net/Java_lilin/article/details/103511795
pjsip c# 參考 https://blog.csdn.net/Java_lilin/article/details/106229860
更多寫法可以參考安卓pjsua2代碼:https://blog.csdn.net/Java_lilin/article/details/89212406