Bootstrap

SIP开源库pjSIP简介

基本框架说明

PJLib使用

Windows下库编译

 

PJSIP(http://www.pjsip.org/)是一个免费的开源多媒体通信库,实现了基于标准的协议(如SIP,SDP,RTP,STUN,TURN和ICE)。把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次、抽象的多媒体通信API。

基本框架说明

PJSIP库主要包括:

  • SIP协议栈:处理SIP消息

  • 流媒体处理模块:RTP/RTCP等媒体包处理

SIP协议部分

SIP协议由下往上进行了多层封装:

  • pjlib库:最底层、最基础的库,实现平台抽象和框架(数据结构、内存分配、文件I/O,线程同步等)

  • pjlib-util库:封装常用算法,如MD5、CRC32等,以及json、xml格式解析

  • pjnath库:处理NAT穿越问题

  • pjmedia和pjmedia-codec库:处理SDP协商、媒体编码和传输等

  • pjsip-core库:SIP协议栈的核心,包含几个重要的模块SIP endpointSIP transaction moduleSIP dialog moduletransport layer

  • pjsip-simple库:SIP时间与出席框架

  • pjsip-ua库:INVITE会话的高层抽象,方便创建一个SIP会话,同时还实现了Client的注册API

  • pjsua库:高层次抽象API,是对前面库的封装

 

媒体处理部分

该模块主要包含两部分:

  • media transport:负责接收媒体流,支持RTP(UDP)、SRTP(加密)、ICE(NAT穿透)

  • 媒体端口(media port)框架:实现了各种媒体端口,每一个端口上定义各种操作(创建、销毁、get/put等),常用媒体端口有:File writer(记录媒体文件),File player(播放媒体文件)、stream port 、conference port(可以实现多方通话)、master port等。

 

 

PJLib使用

在使用PJLib时,需要遵守一定的规则,对应pjsua,在使用里面接口前:

  • 创建SUA:pjsua_create,主要是初始化各底层库、内存池,创建SIP端口(endpoint)

  • 初始化SUA:pjsua_init,主要是初始化SIP-UA(媒体处理、NAT处理等);此时可配置日志文件(只有配置日志文件才会记录日志)

  • 创建传输协议:pjsua_transport_create,创建SIP与Media使用的传输协议(如UDP)

  • 启动SUA:pisa_start,主要启动底层子系统(电话、媒体、出席),并设定SUA为running状态

库使用前初始化流程

auto status=pjsua_create();
if ( !PjRetsuccess(status) ){
  ...
}

//Init pisa
pisua_config pjconf;
pjsua_config_default(&pjconf);
pjconf.cb.on_incoming_call = &Onincomingcall;
pjconf.cb.on_call_media_state = &Onmediastate;
pjconf.cb.on_call_state = &Oncallstate;
pjconf.cb.on_reg_started = &Onregstarted;
piconf.cb.on_reg_state = &Onregstate;

pjsua_logging_config logconf;
pjsua_logging_config_default(&logconf);
logconf.logfilename ="./mylog.log";  // 设定日志文件
logconf.console_level=0; // 禁用console输出
logconf.level = 4; // 记录Deubg及以上的日志(<=此等级的全部记录)
logconf.decor =PJ_LOG_HAS_LEVEL_TEXT;

status=pjsua_init(&pjconf, &logconf, NULL)
if (!PjRetsuccess(status)){
  ...
}

// add transport
pjsua_transport_config portconf;
pjsua_transport_config_default(&portconf);
portconf.port =0;  // select any available
status=pjsua_transport_create(PJSIP_TRANSPORT_UDP, &portconf, NULL);
if (!PjRetsuccess(status)){
  ...
}

// Start now
status=pisa_start();
if (!PjRetsuccess(status)){
  ...
}

在使用完成退出前,需调用pisa_destroy()完成清理工作;若有通话,则需要先通过pjsua_call_hangup_all()来挂断(电话挂断后,需要等待一定时间等待完成媒体端口的断开与清理,如1s)。

Windows下库编译

下载源码后,修改(新建)pjlib/include/pj/config_site.h(主要是各种宏定义,默认可为空),然后使用VS2015直接编译。编译完成后主要生成libpjproject**.libpjsua2-**.lib

  • 若提示库不匹配,修改:C/C++ - 代码生成 - 运行库

  • Link失败,则需要增加依赖库(连接器 - 输入):iphlpapi.lib,;dsound.lib;dxguid.lib;netapi32.lib;mswsock.lib;ws2_32.lib;odbc32.lib;

  • samples中的代码通过pjsip-apps\build\Samples-vc.mak进行编译的,若要调试,需要通过sample_debug工程进行(在debug.cpp中include对应.c文件即可,但要注意c文件使用C++编译时需要修改各种类型转换错误)

若要使用高层接口(C++类)则引用pjsua2和pjproject,否则(使用基本库)只需引用pjproject库即可。对应的头文件在:

  • pjsip/include

  • pjlib/include

  • pjlib-util/include

  • pjmedia/include

  • pjnath/include

 

;