VOIP:pjsip的编译和使用

1pjsip简介

pjsip是免费开源的多媒体通信库,纯c编写,可移植性非常好,支持多种协议,多种编/解码方式。对iOS的后台支持的很好(按文档的所说),v2.3已经支持iOS上的视频传输。鉴于此,pjsip是实现VOIP比较好的选择。

2pjsip编译

可移植性(portable)是pjsip宣称的一大特性。在iOS上的使用方法,有详细的使用手册,这里会简单的记录下需要注意的地方。

2.1 准备

编译首先需要有源码,请到这里查看。对于想直接使用pjsip的建议直接下载release的稳定版本,win系统请下zip格式,其余的请下tar格式。
源码下载好后,进入其中的./pjlib/include/pj/,创建文件config_site.h, 内容如下:

#define PJ_CONFIG_IPHONE 1
#include <pj/config_site_sample.h>

2.2 编译

因为不同iPhone的处理器架构不一样,我们在编译的时候需要指定arch,iPhone6是arm64, 5s是armv7s,5是armv7,使用下面的命令:

$ cd /path/to/your/pjsip/dir
$ ARCH='-arch arm64' ./configure-iphone
$ make dep && make clean && make

这样所需的库和头文件都编译好了,可以运行sample了

2.3 sample

v2.3版本中,进入./pjsip-apps/src/pjsua/ios,打开ipjsua.xcodeproj,运行后会看到一个带有pjsua的黑色界面,底部有诸如:Telnet to xx.xx.xx.xx:xxxx的字样。从v2.1以上的版本,sample带有CLI功能,具体的命令见手册
为了演示如何打电话,需要事先准备好sip服务器,安装好2台测试机。打开terminal,通过telnet连接测试机A,首先添加账号,输入:

+a sip:100@server.com sip:server.com * 100 123456

其中,100是sip服务器上的账号,123456是账号密码,server.com是服务器。如法炮制telnet连接测试机B后,也添加一个账号,如:

+a sip:100@server.com sip:server.com * 100 123456

接下来通过测试机A拨打电话给测试机B:

call new sip:101@server.com

而在测试机B上可以选择接通或挂断:

call answer 200
call hangup

这时拿起手机说话,声音就能从另一台手机中听到。

2.4 模拟器上的使用

模拟器上的编译命令如下:

export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
ARCH="-arch i386" CFLAGS="-O2 -m32 -mios-simulator-version-min=7.0" LDFLAGS="-O2 -m32 -mios-simulator-version-min=7.0" ./configure-iphone
make dep && make clean && make

安装多个Xcode的机器根据情况选择合适Xcode的路径,根据所需适配的iOS最低系统自行修改iOS参数。

3 引入工程

编译好的库和头文件位于以下文件夹内的includelib内:

  • /pjlib
  • /pjlib-util
  • /pjmedia
  • /pjnath
  • /pjnath
  • /third_party

接下来,把lib内的.a文件都拖到xcode工程中,再接着添加include中的文件。对于include内的文件,也可以把上述6个文件夹包含的include文件合并到一个文件夹,然后设置工程的Header Search Paths参数。 接着Xcode6以前的项目需要在pch文件中添加:

#define PJ_AUTOCONF

而Xcode6创建的项目,在Preprocessor Macros中添加PJ_AUTOCONF参数。这样,在需要使用pjsip的地方引入头文件#include <pjsua-lib/pjsua.h>即可使用了。

3.1 支持多版本的编译

分别设置不同的arch,然后使用lipo合并,如:

lipo -arch armv6 lib/armv6/libpjlib.a -arch armv7 lib/armv7/libpjlib.a -create -output lib/libpjlib.a

在测试的时候,可以把真机和模拟器的库打包在一起,等到发布的时候只需要使用真机打包的库。

4 其他要点

4.1 支持openssl

如果通话需要加密,那么请编译openssl,具体方法在这里。暂时还没有用到,但感觉项目以后会用到,先mark下。

4.2 常见问题

还有一些iOS系统集成中常见的问题说明,可以先浏览下,从中也可以看到pjsip对后台任务提供了内在支持。