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 引入工程
编译好的库和头文件位于以下文件夹内的include
和lib
内:
- /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对后台任务提供了内在支持。
Comments