网络电话pjsip Getting Started: Building for Apple iPhone, iPad and iPod Touch
Getting Started: Building for Apple iPhone, iPad and iPod Touch ¶
- Getting Started
- Preparation
- Build for Desktop
- Build for Mobile
- Build for Other
- Next: Using the libraries
- See Also
- Features
- Requirements
- Build Preparation
- Building PJSIP
- Simulator
- OpenSSL Suport
- Common problems
- Unable to accept incoming call in background mode (iOS4)
- Audio session management issue (iOS7)
- Audio issue (no audio) (iOS7)
- Supporting multiple architectures (armv6, armv7, armv7s, and so on)
- Unable to support Bluetooth input
- Problem with interruption (by a phone call or an alarm), headset plug/unplug, or Bluetooth input
- Sound not working in the simulator
- List of Issues
- Other iPhone Projects
Apple iOS target is supported by PJSIP version 1.7 and later.
Features ¶
Some of the features of the iPhone port:
- it has a native CoreAudio based audio device, which supports the following features:
- the built-in/device's echo canceller
- output volume setting
- change input route to bluetooth input
- change output route
- input latency setting
- output latency setting
- supports for the built-in iLBC codec
- Note: video (from 2.x) is not yet supported on iOS.
Requirements ¶
- iOS SDK, part of Xcode. Apple iPad is supported starting with iPhone SDK 3.2 onwards.
- Command Line Tools for Xcode: download from Apple Developer Downloads then install.
Build Preparation ¶
- Get the source code, if you haven't already.
- Set your config_site.h to the following: #define PJ_CONFIG_IPHONE 1
- #include <pj/config_site_sample.h>
- This will activate iPhone specific settings in the config_site_sample.h.
Building PJSIP ¶
Just run:
$ cd /path/to/your/pjsip/dir
$ ./configure-iphone
$ make dep && make clean && make
For iPhone 5, use armv7s architecture:
$ cd /path/to/your/pjsip/dir
$ ARCH='-arch armv7s' ./configure-iphone
$ make dep && make clean && make
Open ipjsua.xcodeproj using Xcode in pjproject/pjsip-apps/src/pjsua/ios and build the project. You will see telnet instructions on the device's screen. Telnet to this address to operate the application. See PJSUA CLI Manual for commands available. (For release 2.1 and below, ipjsua is located in pjproject/pjsip-apps/src/ipjsua and does not have CLI telnet feature).
Notes:
- the ./configure-iphone is a wrapper that calls the standard ./configure script with settings suitable for iPhone target.
- the latest iPhone SDK version will be selected by default. You may change this by setting IPHONESDK environment variable to the desired SDK path. For ipjsua, select Project-Edit Project Settings-Base SDK and Targets-ipjsua-Get Info-Base SDK to change the SDK version.
- you may pass standard ./configure options to this script too.
- for more info, run ./configure-iphone --help
- other customizations are similar to what is explained in Building with GNU page.
Simulator ¶
To configure the build system for the iPhone simulator:
export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
ARCH="-arch i386" CFLAGS="-O2 -m32 -miphoneos-version-min=4.0" LDFLAGS="-O2 -m32 -miphoneos-version-min=4.0" ./configure-iphone
make dep && make clean && make
Note that the exact paths may vary according to your SDK version.
OpenSSL Suport ¶
Follow the instructions below to enable TLS transport by using OpenSSL:
- Build and install OpenSSL-1.0.0 for iPhone by following these instructions or OpenSSL-0.9.8o with these instructions.
- Specify OpenSSL location when running configure-iphone, for example (with Bash): export OPENSSL=${HOME}/openssl/openssl_arm
- export CFLAGS="-O2 -Wno-unused-label -I${OPENSSL}/include"
- export LDFLAGS="-L${OPENSSL}/lib"
- ./configure-iphone
- And check that OpenSSL is detected by the configure script: ...
- checking for OpenSSL installations..
- checking openssl/ssl.h usability... yes
- checking openssl/ssl.h presence... no
- aconfigure: WARNING: openssl/ssl.h: accepted by the compiler, rejected by the preprocessor!
- aconfigure: WARNING: openssl/ssl.h: proceeding with the compiler's result
- checking for openssl/ssl.h... yes
- checking for ERR_load_BIO_strings in -lcrypto... yes
- checking for SSL_library_init in -lssl... yes
- OpenSSL library found, SSL support enabled
- ...
- Build the libraries: make dep && make
- In XCode project setting of your application (for example, ipjsua), add libssl.a and libcrypto.a from OpenSSL ARM directory to the project's Libraries:
- In Group & Files pane, expand ipjsua, then right click Libraries, and select Add -> Existing Files....
- Find libssl.a and libcrypto.a from OpenSSL ARM directory (for example, ${HOME}/openssl/openssl_arm) and add them to the project.
- Build the app
Common problems ¶
Unable to accept incoming call in background mode (iOS4) ¶
If while in the background, ipjsua (or your application) is unable to detect if there is an incoming call and display the local notification:
- Note that background feature only works with TCP.
- Make sure that voip is included in the required background modes (UIBackgroundModes) in the application’s Info.plist file.
- Make sure that the TCP socket is successfully wrapped with CFReadStreamRef (check if there is a message: "Failed to configure TCP transport for VoIP usage").
- Check whether you can accept the incoming call by bringing the app to the foreground. If yes, make sure that the incoming call request comes from the wrapped TCP socket (check the log for the INVITE request).
Note: these steps do not troubleshoot audio problems.
Audio session management issue (iOS7) ¶
Since the deprecation of C-interface Audio Session API in iOS 7 SDK, PJSIP now uses AVAudioSession to set audio session category (to PlayAndRecord?) and activate/deactivate audio session. Application will need to do its own audio session management to handle input/output route and notifications (interruption, media server reset, etc). Please refer to Apple's official doc on Audio Session Programming Guide and our ticket #1697.
Audio issue (no audio) (iOS7) ¶
There are a few reports that the audio is not working on iOS 7 (so far it's only reported to happen in iPhone 5) after getting the following error:
iPhone mediaserverd[45] <Error>: 10:53:59.986 ERROR: [0x240b000] 740: _vp: initialize hw input: fs mismatched! REF=0.000000Hz, MIC=44100.000000Hz
iPhone mediaserverd[45] <Error>: Resampler2 bad sample rate(s) : 0.00 16000.00
One solution is to set the sound device's clock rate to 44100 Hz as to avoid resampling.
Supporting multiple architectures (armv6, armv7, armv7s, and so on) ¶
You need to compile separately for each architecture. If your iPhone SDK has llvm-gcc compiler (which is the supported compiler starting iOS SDK 5) or clang, then you need to set ARCH environment variable to the desired architecture before running configure-iphone, for example:
export ARCH = "-arch armv6"
Then you need to combine the resulting libraries using the lipo command. For example:
lipo -arch armv6 lib/armv6/libpjlib.a -arch armv7 lib/armv7/libpjlib.a -create -output lib/libpjlib.a
Unable to support Bluetooth input ¶
Since Bluetooth input support is only available for iOS 3.1 or later, you need to specifically specify that your deployment target is iOS 3.1 or above. You can do this either in user.mak:
export CFLAGS += -D__IPHONE_OS_VERSION_MIN_REQUIRED=30100
or in config_site.h:
#define __IPHONE_OS_VERSION_MIN_REQUIRED 30100
You need to recompile PJSIP after this.
Problem with interruption (by a phone call or an alarm), headset plug/unplug, or Bluetooth input ¶
For devices running iOS 4.0 or later, you need to enable your application to respond to remote-control events. This allows PJSIP to properly receive and process the above events. You can do this by adding the following code in your application:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
For more details, please refer to Apple's doc on Remote Control of Multimedia.
Sound not working in the simulator ¶
Go to System Preferences > Sound > Sound Effects and then uncheck and recheck "Play user interface sound effects". If it still doesn't work, you can try some other suggestions here.
List of Issues ¶
iPhone: Echo cancellation may not work on iOS using SDK 4.x
iPhone: Long delay when calling AudioConverterNew() causing timeout in acquiring pjsua lock (thanks Bogdan Krakowski the report)
Incoming TCP connection on iPhone iOS4 BG mode would fail over and over with EAGAIN error (thanks Bogdan Krakowski for the report)
Crash in coreaudio_dev (iPhone OS) when there is no call during a GSM interruption
Fix crash in coreaudio_dev's interruptionListener (iPhone OS) and support for multiple interrupted streams (thanks to Seth Hinze for the patch)
iPhone: Fix problems with echo cancellation and Bluetooth input (SDK 4.x)
iPhone: UDP socket send error after waking up from background mode (thanks Joe Meade for the report)
iPhone (info only): No audio in calls if app is woken up from background mode without network connectivity (thanks Joe Meade for the report)
Long delay in iPhone initialization (thanks Guy Zelkha for the report)
Crash in iPhone iOS when trying to make a call after the application is left running for days (thanks Alejandro Orellana for the report)
Assertion may be raised if iPhone app woken up to perform registration and the server is down (thanks Alejandro Orellana for the report)
Use CFHost API for pj_getaddrinfo() on iPhone OS
Build correctness on non-video platforms (Symbian, iPhone, Windows Mobile)
Fixes assertion when interruptionListener is called from an unregistered thread on iPhone OS (thanks to Ilya Kalinin for the patch)
Disable local host resolution on iPhone OS
Handle socket failure in STUN resolution when coming back from iPhone/iOS background mode
Other iPhone Projects ¶
Also have a look at these PJSIP iPhone ports by pjsip users:
- Siphon Project by Samuel Vinson
- iPhone Audio Driver by Voalté
- TabikPhone, an adaptation of Sipphone code from V-Net Corp
Attachments
网络电话pjsip Getting Started: Building for Apple iPhone, iPad and iPod Touch的更多相关文章
- iOS 图标、图形尺寸? iPhone、iPad、 iPod touch
链接地址:http://www.zhihu.com/question/20248971 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:刘剑链接:http://www.zhi ...
- Apple iPhone 12 Pro 数据迁移方式 All In One
Apple iPhone 12 Pro 数据迁移方式 All In One iPhone 12 Pro https://mp.weixin.qq.com/s/US1Z_69zVQIhV-cNW1E6A ...
- 【优秀的iPhone/iPad数据恢复工具】Omni Recover for Mac 2.5
[简介] 今天和大家分享最新的 Omni Recover for Mac 2.5 版本,这是一款Mac上优秀的iPhone/iPad设备数据恢复工具,支持恢复误删除的短信.照片.视频.文档.通话记录等 ...
- 吐槽 Apple iPhone 十大反人类的设计 All In One
吐槽 Apple iPhone 十大反人类的设计 All In One 不支持 GPS 快捷开关 每次都要到,设置> 隐身 > 位置,脑残的设计 顶部的状态栏,网络不支持显示网速 顶部的状 ...
- 最新 Apple iPhone 12 价格 All In One
最新 Apple iPhone 12 价格 All In One 美版价格 Apple iPhone 12 mini $699 Apple iPhone 12 $799 Apple iPhone 12 ...
- 忘记Apple ID密码,如何从iPhone/iPad上移除iCloud账号
忘记Apple ID密码?不用担心!在本文中,我们将分享3种有效方法,即使您不知道密码,也可以轻松移除iPhone或iPad设备上的iCloud账号. 注意:移除iCloud 账号前请备份数据 在开始 ...
- HOWTO: Create native-looking iPhone/iPad applications from HTML, CSS and JavaScript
HOWTO: Create native-looking iPhone/iPad applications from HTML, CSS and JavaScript Though it's not ...
- 【Openvpn】iOS OpenVPN客户端设置指南(适用iPhone/iPad)
适用于iPhone/iPad/这些iOS设备.之前iOS使用OpenVPN是需要越狱的,并且是付费第三方应用. 去年开始OpenVPN官方推出了iOS客户端就好用多了,免费也无需越狱. 说明:如果是新 ...
- 强制关闭iPhone iPad AppleWatch MacOS
iPhone/iPad 强制关闭APP:按住Power(电源键),出现关机界面松开,按住Home键9秒左右. 强制重启/关机:同时按住Power和Home键几秒后重启,出现logo时松开Home继续按 ...
随机推荐
- 【Unity笔记】一些Mecanim动画系统、状态机的参数细节
动画混合树Blend Tree调整动画片段的播放速度: 0 动画不播放 -1 动画倒着播放:如果只有“往前走”的动画,可以变成“往后走”动画 勾选动画是否镜像: 左右颠倒(挥左手变成挥右手) 过度条件 ...
- Eclipse里安装插件
1.在eclipse中选择 help->install new software. 2.在work with 框中输入:Indigo - http://download.eclipse.org/ ...
- HTTP小结
http 一.HTTP协议简介 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交 ...
- jquery轮播控件
网上找了一个轮播控件,效果不错,而且很容易改,需要的同学去下载咯 地址是:http://download.csdn.net/detail/jine515073/7704143
- 【转】MFC CreateFont 用法
中国人自古就有自右至左.从上到下书写汉字的习惯.而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字.有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实 ...
- Spring 4 官方文档学习(六)核心技术之Spring AOP
目录 1.介绍 1.1.AOP概念 1.2.Spring AOP 能力 和 目标 1.2.1.简介 1.2.2.@AspectJ 支持 1.2.3.声明一个aspect 例子 1.2.4.声明advi ...
- ConfigParser.NoSectionError: No section: 'MongoDB'
场景:手动执行bat文件正常,schtasks定时执行bat文件时报错. 原因:定时执行时,ini配置文件找不到.Windows 下用 schtasks 定时执行脚本的默认起始路径为:C:\Windo ...
- 同一页面中引入多个JS库产生的冲突解决方案(转)
发生JS库冲突的主要原因:与jQuery库一样,许多JS库都使用‘$’符号作为其代号.因此在一个页面中引入多个JS库,并且使用‘$’作为代号时,程序不能识别其代表哪个库(这个是我自己的解释,但更深的原 ...
- 【Java面试题】47 heap和stack有什么区别
java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...
- Spring-MVC案例:Spitter的笔记
源码地址:https://github.com/Young4Dream/yan/tree/master/Maven_spittr 笔记: 1.当DispatcherServlet启动时,会创建Spri ...