基本框架說明
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