基本框架说明
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 endpoint
,SIP transaction module
,SIP dialog module
,transport 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**.lib
和pjsua2-**.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