Windows下基于PJSIP的视频通话控件的研究与实现

2018-11-26 09:33李玲玲
电脑知识与技术 2018年23期

李玲玲

摘要:PJSIP是一个开源的SIP协议栈,作为基于SIP的一个多媒体通信框架,它提供了非常清晰的API,实现了SIP、SDP、RTP、STUN、TURN、ICE等协议,以及NAT穿越的功能。PJSIP具有非常好的移植性,几乎支持现今所有系统:从桌面系统、嵌入式系统到智能手机。PJSIP支持语音、视频、状态呈现和即时通讯。PJSIP具有非常完善的文档资料,对开发者是很友好的。本文基于PJSIP协议实现了Windows平台下的音视频通信系统,其功能包括SIP账号注册、音视频通信、状态呈现等。通过在Windows 7操作系统下的测试表明,SIP通信系统的各项功能运行稳定,对PJSIP修改的部分也达到了预期的效果。系统还具有良好的可扩展性,后期可以在此基础上进行更多的功能实现。

关键词:PJSIP;FreeSwitch;SIP

中图分类号:TN911-34 文献标识码:A 文章编号:1009-3044(2018)23-0241-03

Abstract: PJSIP is a free and open source multimedia communication protocol stack. As a multimedia communication framework based on SIP, PJSIP provides a very clear API, and implements standard based protocols such as SIP, SDP, RTP, STUN , TURN, ICE, and NAT traversal function. PJSIP has a very good portability, almost supporting all the existing systems ranging from desktops, embedded systems to mobile handsets.It supports audio, video,presence, and instant messaging,PJSIP has perfect documents and is very friendly to developers.Based on the PJSIP stack,I realize an audio and video communication system in the Windows platform.Its functions include the SIP account registration,audio and video communication,status presence,etc.Tests under Windows 7 operating systems demonstrate that all function of the SIP communication system works stably,the modification of PJSIP also achieved the expected affect.The system also has good extensibility and we can add more functions to it in the future.

Key words: PJSIP; FreeSwitch; SIP

1 PJSIP的簡介

PJSIP是一个开源的SIP协议栈,支持多种SIP的扩展功能,作为基于SIP协议的一个多媒体通信框架,它提供了非常清晰的API,实现了SDP、RTP、SIP、STUN、TURN、ICE等协议,以及NAT穿越的功能。并且具有非常好的移植性,几乎支持现今所有系统:从桌面系统、嵌入式系统到智能手机。同时支持语音、视频、状态呈现和即时通讯。它具有非常完善的文档,对开发者是很友好的。PJSIP由Benny Prijono、Perry Ismangil在2005年创建,之后不久,Nanang Izzuddin、Sauw Ming加入开发团队。2006年成立Teluu Ltd.,成为开发和维护PJSIP的公司。PJSIP采用双License:GPLv2以及商业许可证,开发者可以根据需要选择不同的License。

1.1 PJSIP框架

PJSIP包括:PJSIP - Open Source SIP Stack[开源的SIP协议栈]、PJMEDIA - Open Source Media Stack[开源的媒体栈]、PJNATH - Open Source NAT Traversal Helper Library[开源的NAT-T辅助库]、PJLIB - UTIL - Auxiliary Library[辅助工具库]、PJLIB - Ultra Portable Base Framework Library[基础框架库]、PJSUA-LIB等模块。

其中PJSIP包含:CORE、SIMPLE、UA三个模块,在PJMEDIA中包含了CODEC模块。PJSIP的框架图如图1所示。

1.2 PJLIB框架

PJLIB是整个PJSIP库的基础,所有的子模块都是依赖于PJLIB,它主要实现对平台的抽象,屏蔽了不同操作系统之间的差异,向上为PJSIP框架的业务相关模块提供统一的接口。PJLIB提供的接口涉及如下几个方面:

1) 内存池方式的内存分配。

2) OS抽象。

3) 网络相关的支持。

4) 时间管理。

5) 各种工具性的数据结构。

6) 异常处理。

7) LOG机制。

8) 随机数及GUID的产生。

1.3 PJLIB-UTIL

PJLIB-UTIL是辅助工具库。提供的辅助工具包括:

1) 提供命令行操作的接口。

2) 提供加密算法,如Base64、CRC32、MD5、SHA1等。

3) 文本跟字符串处理。

4) DNS协议处理。

5) 文件读写的处理,如JSON、XML解析处理。

1.4 PJNATH

PJNATH是开源的NAT穿越辅助库,提供了标准的基于NAT的穿越方案。

1.5 PJMEDIA

PJMEDIA是开源的媒体栈,支持很多音视频格式的处理、具有移植性强、代码精简、媒体处理质量优秀、对硬件支持度高以及扩展性良好等优点。PJMEDIA还对SIP中的SDP协商提供部分支持,主要为SIP协议提供可传输的媒体类型。在通信双方的SDP沟通协商过程中,最终商定的传输媒体类型主要由PJMEDIA模块提供支持。

1.6 PJMEDIA-CODEC

PJMEDIA-CODEC是一个静态库,它包含了各种编解码器的实现,对上层模块通过提供PJMEDIA-CODEC框架来便于进行编解码处理,该框架屏蔽了下层各个编解码器的细节。

1.7 PJSIP、PJSIP-SIMPLE

PJSIP、PJSIP-SIMPLE是实现标准SIP协议以及SIMPLE扩展协议的SIP栈。

1.8 PJSIP-LIB、PJSUA-LIB

PJSIP-LIB以及PJSUA-LIB主要包含pjsua2和pjsua。其中pjsua2是面向对象的C++语言实现,pjsua是面向过程的C语言实现。pjsua2封装了pjsua,为上层应用提供面向对象的接口。这两个库封装了PJSIP框架底层的SIP棧、媒体处理及NAT穿越等功能,提供更高级的面向网络电话业务的接口。

2 PJSIP配置和编译

从www.linphone.org下载如下文件:linphone-3.5.2.tar.gz、libeXosip2-3.3.0.tar.gz、libosip2-3.3.0.tar.gz、 speex-1.2rc1.tar.gz、linphone-deps-win32-120218.zip。其中linphone-3.5.2.tar.gz主要包含linphone、oRTP、mediastreamer2,libosip2-3.3.0.tar.gz主要包含osip、osipparser2,libeXosip2-3.3.0.tar.gz为eXosip2; speex-1.2rc1.tar.gz在编译mediastreamer库时需要。linphone-deps-win32-120218.zip包含运行所需的库及配置文件等。

2.1 编译osipparser2库、eXosip库、osip库

这三个库下载的只有源码,没有vs项目文件,需要新建osipparser2、eXosip、osip三个项目。

以osippparser2为例,创建空的动态库项目,项目名为osipparser2,将libosip2-3.1.0/src/osipparser2文件夹下的文件全部复制到刚创建的项目根目录下,并将所有的源文件和头文件都加入项目内,同时将libosip2-3.1.0中的INCLUDE文件夹导入到创建的工程中,编译链接即可生成osipparser2.dll。

以osippparser2为例,创建空的静态库项目,项目名为osipparser2,将libosip2-3.1.0/src/osipparser2文件夹下的文件全部复制到刚创建的项目根目录下,并将所有的源文件和头文件都加入项目内,同时将libosip2-3.1.0中的INCLUDE文件夹导入到创建的工程中,编译链接即可生成osipparser2.lib。

要注意的是此处需新建def文件,在文件中添加要导出的接口函数。osip2和eXosip方法类似,不再赘述。

2.2 编译oRTP库、mediastreamer2库

oRTP源码包中已经有对应的vs项目,无需做任何修改可直接编译运行生成对应的库文件。mediastreamer2源码包虽然有vs项目,但还需要稍作修改才可编译:在项目属性中添加一条宏定义:MS2_INTERNAL,然后删除文件gsm.c,再添加qualityindicator.c、bitratecontrol.c、audioconference.c、eventqueue.c、bitratedriver.c 到工程中。

2.3 创建phonecore

在linphone/coreapi中没有提供相应的vs项目,需新建动态链接库项目,将linphone/coreapi文件夹中除test_lsd.c、test_ecc.c 、tunnelmanager.hh、linphonecore_jni.cc、sipwizard.c、tunnelmanager.cc文件外的其他文件都添加到项目中,再新建def文件,在文件中添加需要用到的接口函数。

由于自定义的unistd.h,需要将头文件引用方式由#include 改为#include "unistd.h"。

在lpconfig.c文件中找到: if (chmod(filename, S_IRUSR | S_IWUSR) == -1),并注释掉该if分支的所有语句。

在sal_eXosip2.c文件中找到:eXosip_set_tls_ctx(&tlsCtx;),注释掉该调用语句。

此时编译出现错误提示信息: too many initializers,定位到源码SipSetup linphone_sip_login中发现其赋值的个数比定义的个数多,这里需要删除sip_login_init_instance和sip_login_do_logout之间的3个的NULL。

然后修改misc.c,在文件中找到lp_spawn_command_line_sync函数,由于在windows平台下不支持popene及pclose函数,需要将其中的第一行做如下修改:#if !defined(_WIN32_WCE) && !defined(_WIN32)。

此外,在编译过程中出现“未声明的标示符”或“将此类型用作表达式非法”等错误信息时,这是找不到函数的定义所致,需将函数的定义放在文件头。

3 SIP服务器的选择及运行结果

3.1 SIP服务器的选择

本系統中选择开源的FreeSwitch。FreeSwitch是一种功能强大的VoIP开源软交换机,兼容多种主流协议,包括SIP、H.323、H.261、H.263、H.264、MP4等,它具有以下几个特点:

1)采用的是模块化设计理念,通过使用特定的接口进行功能扩展,从而减小了系统核心对其它功能模块的依赖性。

2)提供特定的API支持业务控制逻辑,系统控制流程支持使用JavaScript、Perl等脚本语言实现。

3)拥有中心化的可扩展标记语言(XML)注册表,从而使文件查询解析更加方便。

4)与Asterisk、Kamailio等同类型的VoIP软交换平台相比较,FreeSwitch能够并发支持更多的会话连接。

3.2 运行结果

4 结束语

本文中对PJSIP的源码做了部分的修改,能够实现Windows平台下的双向720P视频通话功能,还有很多待优化的地方,如三方通话等功能,后期将继续关注PJSIP的发展,希望能够在PJSIP领域得到更进一步的提高。

参考文献:

[1] 邓凯. 基于Android平台的PJSIP协议栈优化设计与实现[D]. 北京: 北京邮电大学, 2016.

[2] 凌小荣. 基于SIP网络音视频通信的研究与实现[D]. 广州: 华南理工大学, 2014.

[3] 陈欢. 支持移动终端的SIP客户端设计与实现[D]. 沈阳: 中国科学院沈阳计算技术研究所, 2008.

[4] 黄月祥. 基于PJSIP的嵌入式VoIP终端的研究与实现[D]. 昆明: 昆明理工大学, 2011.

[5] 孙涛,秦雅娟,杨冬,等. 基于FreeSwitch的会议电话系统研究与实现[J]. 铁道通信信号, 2011,9(47).

【通联编辑:梁书】