VS2015实现PJSIP库的编译与运行

PJSIP介绍

​​​ ​​​​​​​PJSIP是一个用C语言编写的免费开源多媒体通信库,实现了基于标准的协议,如SIP,SDP,RTP,STUN,TURN和ICE。它将**信令协议(SIP)**与丰富的多媒体框架和NAT遍历功能结合到高级API中,该API可移植,适用于从桌面,嵌入式系统到移动手持设备的几乎任何类型的系统。PJSIP既紧凑又功能丰富。它支持音频,视频,状态和即时消息,并具有丰富的文档。PJSIP 非常便携。在移动设备上,它抽象出系统相关的功能,并且在许多情况下能够利用设备的本机多媒体功能。PJSIP由一个自2005年以来专门为该项目工作的小团队开发,有来自世界各地的数百名开发人员参与,并自2007年起在SIP互操作性事件(SIPit)中定期进行测试。

PJSIP的下载

直接去开源的官方网站下载[https://www.pjsip.org/]

VS2015下载安装编译库

解压PJSIP -> pjproject-2.8

  1. 解压后的文件,具体文件内容我也是初学者没有具体的分析,这边不做介绍。
    解压后的文件描述
  2. VS2015添加库,VS添加库的方法比较简单
  • 以添加pjsip库为例:
    VS创建新的工程,添加项目,寻找项目的路径。\libpjsip\pjlib\build
    寻找VS工程添加即可。
  • 编译
    编译的时候回出问题,显示找不到头文件config_site.h
    只要自己按需求在目录\libpjsip\pjlib\include\pj添加一个config_site.h头文件即可。
  • 头文件内容参考
#if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE!=0

   /*
    * PJLIB settings.
    */

   /* Disable floating point support */
   #define PJ_HAS_FLOATING_POINT		0

   /*
    * PJMEDIA settings
    */

   /* Select codecs to disable */
   #define PJMEDIA_HAS_L16_CODEC		0
   #define PJMEDIA_HAS_ILBC_CODEC		0

   /* We probably need more buffers on WM, so increase the limit */
   #define PJMEDIA_SOUND_BUFFER_COUNT		32

   /* Fine tune Speex's default settings for best performance/quality */
   #define PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY	5

   /* For CPU reason, disable speex AEC and use the echo suppressor. */
   #define PJMEDIA_HAS_SPEEX_AEC		0

   /* Previously, resampling is disabled due to performance reason and
    * this condition prevented some 'light' wideband codecs (e.g: G722.1)
    * to work along with narrowband codecs. Lately, some tests showed
    * that 16kHz <-> 8kHz resampling using libresample small filter was 
    * affordable on ARM9 260 MHz, so here we decided to enable resampling.
    * Note that it is important to make sure that libresample is created
    * using small filter. For example PJSUA_DEFAULT_CODEC_QUALITY must
    * be set to 3 or 4 so pjsua-lib will apply small filter resampling.
    */
   //#define PJMEDIA_RESAMPLE_IMP		PJMEDIA_RESAMPLE_NONE
   #define PJMEDIA_RESAMPLE_IMP		PJMEDIA_RESAMPLE_LIBRESAMPLE

   /* Use the lighter WSOLA implementation */
   #define PJMEDIA_WSOLA_IMP			PJMEDIA_WSOLA_IMP_WSOLA_LITE

   /*
    * PJSIP settings.
    */

   /* Set maximum number of dialog/transaction/calls to minimum to reduce
    * memory usage 
    */
   #define PJSIP_MAX_TSX_COUNT 		31
   #define PJSIP_MAX_DIALOG_COUNT 		31
   #define PJSUA_MAX_CALLS			4

   /*
    * PJSUA settings
    */

   /* Default codec quality, previously was set to 5, however it is now
    * set to 4 to make sure pjsua instantiates resampler with small filter.
    */
   #define PJSUA_DEFAULT_CODEC_QUALITY		4

   /* Set maximum number of objects to minimum to reduce memory usage */
   #define PJSUA_MAX_ACC			4
   #define PJSUA_MAX_PLAYERS			4
   #define PJSUA_MAX_RECORDERS			4
   #define PJSUA_MAX_CONF_PORTS		(PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
   #define PJSUA_MAX_BUDDIES			32

#endif	/* PJ_WIN32_WINCE */


/*
* Typical configuration for Symbian OS target
*/
#if defined(PJ_SYMBIAN) && PJ_SYMBIAN!=0

   /*
    * PJLIB settings.
    */

   /* Disable floating point support */
   #define PJ_HAS_FLOATING_POINT		0

   /* Misc PJLIB setting */
   #define PJ_MAXPATH				80

   /* This is important for Symbian. Symbian lacks vsnprintf(), so
    * if the log buffer is not long enough it's possible that
    * large incoming packet will corrupt memory when the log tries
    * to log the packet.
    */
   #define PJ_LOG_MAX_SIZE			(PJSIP_MAX_PKT_LEN+500)

   /* Since we don't have threads, log buffer can use static buffer
    * rather than stack
    */
   #define PJ_LOG_USE_STACK_BUFFER		0

   /* Disable check stack since it increases footprint */
   #define PJ_OS_HAS_CHECK_STACK		0


   /*
    * PJMEDIA settings
    */

   /* Disable non-Symbian audio devices */
   #define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO	0
   #define PJMEDIA_AUDIO_DEV_HAS_WMME		0

   /* Select codecs to disable */
   #define PJMEDIA_HAS_L16_CODEC		0
   #define PJMEDIA_HAS_ILBC_CODEC		0
   #define PJMEDIA_HAS_G722_CODEC		0

   /* Fine tune Speex's default settings for best performance/quality */
   #define PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY	5

   /* For CPU reason, disable speex AEC and use the echo suppressor. */
   #define PJMEDIA_HAS_SPEEX_AEC		0

   /* Previously, resampling is disabled due to performance reason and
    * this condition prevented some 'light' wideband codecs (e.g: G722.1)
    * to work along with narrowband codecs. Lately, some tests showed
    * that 16kHz <-> 8kHz resampling using libresample small filter was 
    * affordable on ARM9 222 MHz, so here we decided to enable resampling.
    * Note that it is important to make sure that libresample is created
    * using small filter. For example PJSUA_DEFAULT_CODEC_QUALITY must
    * be set to 3 or 4 so pjsua-lib will apply small filter resampling.
    */
   //#define PJMEDIA_RESAMPLE_IMP		PJMEDIA_RESAMPLE_NONE
   #define PJMEDIA_RESAMPLE_IMP		PJMEDIA_RESAMPLE_LIBRESAMPLE

   /* Use the lighter WSOLA implementation */
   #define PJMEDIA_WSOLA_IMP			PJMEDIA_WSOLA_IMP_WSOLA_LITE

   /* We probably need more buffers especially if MDA audio backend 
    * is used, so increase the limit 
    */
   #define PJMEDIA_SOUND_BUFFER_COUNT		32

   /*
    * PJSIP settings.
    */

   /* Disable safe module access, since we don't use multithreading */
   #define PJSIP_SAFE_MODULE			0

   /* Use large enough packet size  */
   #define PJSIP_MAX_PKT_LEN			2000

   /* Symbian has problem with too many large blocks */
   #define PJSIP_POOL_LEN_ENDPT		1000
   #define PJSIP_POOL_INC_ENDPT		1000
   #define PJSIP_POOL_RDATA_LEN		2000
   #define PJSIP_POOL_RDATA_INC		2000
   #define PJSIP_POOL_LEN_TDATA		2000
   #define PJSIP_POOL_INC_TDATA		512
   #define PJSIP_POOL_LEN_UA			2000
   #define PJSIP_POOL_INC_UA			1000
   #define PJSIP_POOL_TSX_LAYER_LEN		256
   #define PJSIP_POOL_TSX_LAYER_INC		256
   #define PJSIP_POOL_TSX_LEN			512
   #define PJSIP_POOL_TSX_INC			128

   /*
    * PJSUA settings.
    */

   /* Default codec quality, previously was set to 5, however it is now
    * set to 4 to make sure pjsua instantiates resampler with small filter.
    */
   #define PJSUA_DEFAULT_CODEC_QUALITY		4

   /* Set maximum number of dialog/transaction/calls to minimum */
   #define PJSIP_MAX_TSX_COUNT 		31
   #define PJSIP_MAX_DIALOG_COUNT 		31
   #define PJSUA_MAX_CALLS			4

   /* Other pjsua settings */
   #define PJSUA_MAX_ACC			4
   #define PJSUA_MAX_PLAYERS			4
   #define PJSUA_MAX_RECORDERS			4
   #define PJSUA_MAX_CONF_PORTS		(PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
   #define PJSUA_MAX_BUDDIES			32
#endif


/*
* Additional configuration to activate APS-Direct feature for
* Nokia S60 target
*
* Please see http://trac.pjsip.org/repos/wiki/Nokia_APS_VAS_Direct
*/
#ifdef PJ_CONFIG_NOKIA_APS_DIRECT

   /* MUST use switchboard rather than the conference bridge */
   #define PJMEDIA_CONF_USE_SWITCH_BOARD	1

   /* Enable APS sound device backend and disable MDA & VAS */
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA	0
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_APS	1
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS	0

   /* Enable passthrough codec framework */
   #define PJMEDIA_HAS_PASSTHROUGH_CODECS	1

   /* And selectively enable which codecs are supported by the handset */
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMU	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMA	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_G729	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC	1

#endif


/*
* Additional configuration to activate VAS-Direct feature for
* Nokia S60 target
*
* Please see http://trac.pjsip.org/repos/wiki/Nokia_APS_VAS_Direct
*/
#ifdef PJ_CONFIG_NOKIA_VAS_DIRECT

   /* MUST use switchboard rather than the conference bridge */
   #define PJMEDIA_CONF_USE_SWITCH_BOARD	1

   /* Enable VAS sound device backend and disable MDA & APS */
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA	0
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_APS	0
   #define PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS	1

   /* Enable passthrough codec framework */
   #define PJMEDIA_HAS_PASSTHROUGH_CODECS	1

   /* And selectively enable which codecs are supported by the handset */
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMU	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMA	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_G729	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC	1

#endif


/*
* Configuration to activate "APS-Direct" media mode on Windows,
* useful for testing purposes only.
*/
#ifdef PJ_CONFIG_WIN32_WMME_DIRECT

   /* MUST use switchboard rather than the conference bridge */
   #define PJMEDIA_CONF_USE_SWITCH_BOARD	1

   /* Only WMME supports the "direct" feature */
   #define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO	0
   #define PJMEDIA_AUDIO_DEV_HAS_WMME		1

   /* Enable passthrough codec framework */
   #define PJMEDIA_HAS_PASSTHROUGH_CODECS	1

   /* Only PCMA and PCMU are supported by WMME-direct */
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMU	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMA	1
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR	0
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_G729	0
   #define PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC	0

#endif

/*
* iPhone sample settings.
*/
#if PJ_CONFIG_IPHONE
   /*
    * PJLIB settings.
    */

   /* Both armv6 and armv7 has FP hardware support.
    * See https://trac.pjsip.org/repos/ticket/1589 for more info
    */
   #define PJ_HAS_FLOATING_POINT		1

   /*
    * PJMEDIA settings
    */

   /* We have our own native CoreAudio backend */
   #define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO	0
   #define PJMEDIA_AUDIO_DEV_HAS_WMME		0
   #define PJMEDIA_AUDIO_DEV_HAS_COREAUDIO	1

   /* The CoreAudio backend has built-in echo canceller! */
   #define PJMEDIA_HAS_SPEEX_AEC    0

   /* Disable some codecs */
   #define PJMEDIA_HAS_L16_CODEC		0
   //#define PJMEDIA_HAS_G722_CODEC		0

   /* Use the built-in CoreAudio's iLBC codec (yay!) */
   #define PJMEDIA_HAS_ILBC_CODEC		1
   #define PJMEDIA_ILBC_CODEC_USE_COREAUDIO	1

   /* Fine tune Speex's default settings for best performance/quality */
   #define PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY	5

   /*
    * PJSIP settings.
    */

   /* Increase allowable packet size, just in case */
   //#define PJSIP_MAX_PKT_LEN			2000

   /*
    * PJSUA settings.
    */

   /* Default codec quality, previously was set to 5, however it is now
    * set to 4 to make sure pjsua instantiates resampler with small filter.
    */
   #define PJSUA_DEFAULT_CODEC_QUALITY		4

   /* Set maximum number of dialog/transaction/calls to minimum */
   #define PJSIP_MAX_TSX_COUNT 		31
   #define PJSIP_MAX_DIALOG_COUNT 		31
   #define PJSUA_MAX_CALLS			4

   /* Other pjsua settings */
   #define PJSUA_MAX_ACC			4
   #define PJSUA_MAX_PLAYERS			4
   #define PJSUA_MAX_RECORDERS			4
   #define PJSUA_MAX_CONF_PORTS		(PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
   #define PJSUA_MAX_BUDDIES			32

#endif

/*
* Android sample settings.
*/
#if PJ_CONFIG_ANDROID

   /*
    * PJLIB settings.
    */

   /* Disable floating point support */
   #undef PJ_HAS_FLOATING_POINT
   #define PJ_HAS_FLOATING_POINT		0

   /*
    * PJMEDIA settings
    */

   /* We have our own OpenSL ES backend */
   #define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO	0
   #define PJMEDIA_AUDIO_DEV_HAS_WMME		0
   #define PJMEDIA_AUDIO_DEV_HAS_OPENSL        0
   #define PJMEDIA_AUDIO_DEV_HAS_ANDROID_JNI	1

   /* Disable some codecs */
   #define PJMEDIA_HAS_L16_CODEC		0
   //#define PJMEDIA_HAS_G722_CODEC		0

   /* Fine tune Speex's default settings for best performance/quality */
   #define PJMEDIA_CODEC_SPEEX_DEFAULT_QUALITY	5
   
   /*
    * PJSIP settings.
    */

   /* Increase allowable packet size, just in case */
   //#define PJSIP_MAX_PKT_LEN			2000

   /*
    * PJSUA settings.
    */

   /* Default codec quality, previously was set to 5, however it is now
    * set to 4 to make sure pjsua instantiates resampler with small filter.
    */
   #define PJSUA_DEFAULT_CODEC_QUALITY		4

   /* Set maximum number of dialog/transaction/calls to minimum */
   #define PJSIP_MAX_TSX_COUNT 		31
   #define PJSIP_MAX_DIALOG_COUNT 		31
   #define PJSUA_MAX_CALLS			4

   /* Separate worker thread for timer and ioqueue */
   // #define PJSUA_SEPARATE_WORKER_FOR_TIMER	1

   /* Other pjsua settings */
   #define PJSUA_MAX_ACC			4
   #define PJSUA_MAX_PLAYERS			4
   #define PJSUA_MAX_RECORDERS			4
   #define PJSUA_MAX_CONF_PORTS		(PJSUA_MAX_CALLS+2*PJSUA_MAX_PLAYERS)
   #define PJSUA_MAX_BUDDIES			32
#endif


/*
* BB10
*/
#if defined(PJ_CONFIG_BB10) && PJ_CONFIG_BB10
   /* Quality 3 - 4 to use resampling small filter */
   #define PJSUA_DEFAULT_CODEC_QUALITY			4
   #define PJMEDIA_HAS_LEGACY_SOUND_API		0
   #undef PJMEDIA_HAS_SPEEX_AEC
   #define PJMEDIA_HAS_SPEEX_AEC			0
   #undef PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO
   #define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO		0
   #undef PJMEDIA_AUDIO_DEV_HAS_ALSA
   #define PJMEDIA_AUDIO_DEV_HAS_ALSA			0    
#endif


/*
* Minimum size
*/
#ifdef PJ_CONFIG_MINIMAL_SIZE

#   undef PJ_OS_HAS_CHECK_STACK
#   define PJ_OS_HAS_CHECK_STACK	0
#   define PJ_LOG_MAX_LEVEL		0
#   define PJ_ENABLE_EXTRA_CHECK	0
#   define PJ_HAS_ERROR_STRING		0
#   undef PJ_IOQUEUE_MAX_HANDLES
/* Putting max handles to lower than 32 will make pj_fd_set_t size smaller
* than native fdset_t and will trigger assertion on sock_select.c.
*/
#   define PJ_IOQUEUE_MAX_HANDLES	32
#   define PJ_CRC32_HAS_TABLES		0
#   define PJSIP_MAX_TSX_COUNT		15
#   define PJSIP_MAX_DIALOG_COUNT	15
#   define PJSIP_UDP_SO_SNDBUF_SIZE	4000
#   define PJSIP_UDP_SO_RCVBUF_SIZE	4000
#   define PJMEDIA_HAS_ALAW_ULAW_TABLE	0

#elif defined(PJ_CONFIG_MAXIMUM_SPEED)
#   define PJ_SCANNER_USE_BITWISE	0
#   undef PJ_OS_HAS_CHECK_STACK
#   define PJ_OS_HAS_CHECK_STACK	0
#   define PJ_LOG_MAX_LEVEL		3
#   define PJ_ENABLE_EXTRA_CHECK	0
#   define PJ_IOQUEUE_MAX_HANDLES	5000
#   define PJSIP_MAX_TSX_COUNT		((640*1024)-1)
#   define PJSIP_MAX_DIALOG_COUNT	((640*1024)-1)
#   define PJSIP_UDP_SO_SNDBUF_SIZE	(24*1024*1024)
#   define PJSIP_UDP_SO_RCVBUF_SIZE	(24*1024*1024)
#   define PJ_DEBUG			0
#   define PJSIP_SAFE_MODULE		0
#   define PJ_HAS_STRICMP_ALNUM		0
#   define PJSIP_UNESCAPE_IN_PLACE	1

#   if defined(PJ_WIN32) || defined(PJ_WIN64) 
#     define PJSIP_MAX_NET_EVENTS	10
#   endif

#   define PJSUA_MAX_CALLS		512

#endif

  • 成功截图
    • 测试程序
#include <mysip.h>


/* Init random seed */
static void init_random_seed(void)
{
    pj_sockaddr addr;
    const pj_str_t* hostname;
    pj_uint32_t pid;
    pj_time_val t;
    unsigned seed = 0;

    /* Add hostname */
    hostname = pj_gethostname();
    seed = pj_hash_calc(seed, hostname->ptr, (int)hostname->slen);

    /* Add primary IP address */
    if (pj_gethostip(pj_AF_INET(), &addr) == PJ_SUCCESS) {
        seed = pj_hash_calc(seed, &addr.ipv4.sin_addr, 4);
    }

    /* Get timeofday */
    pj_gettimeofday(&t);
    seed = pj_hash_calc(seed, &t, sizeof(t));

    /* Add PID */
    pid = pj_getpid();
    seed = pj_hash_calc(seed, &pid, sizeof(pid));

    /* Init random seed */
    pj_srand(seed);
}

int main()
{
    pj_status_t status;
    pj_str_t str[1] = { "TEST", 4 };
    pj_str_t str1[1];
    str1->ptr = NULL;
    str1->slen = 0;
    // Error handling omited for clarity

    // Must initialize PJLIB first!
    status = pj_init();
    /* Init random seed */
    init_random_seed();

    printf("%.*s\n", str->slen, str->ptr);
    
    getchar();
    return 0;
}

  • 成功的截图
    -在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35577355/article/details/83213893
今日推荐