pjsiplinux编译
‘壹’ 如何用c++调用pjsip库实现一个简单的sip服务器
1、开源的sip服务器端,比较好用的是Asterisk,标准C程序实现,代码清晰。
2、sip的client相对比较多,主要有exosip,pjsip和opal。exosip简单易用,在PC上用比较方便。但是涉及的相关资源太多,用了osip,srtp,ms2等众多的开源库,ms2下面还用到了ffmpeg,别的不说,光编译就是噩梦。opal功能最强,虽然也用到了ffmpeg ,但是自己封装的非常好,采用插件方式,调用灵活。opal采用class方式提供封装,接口非常友好。感觉唯一不爽的地方,就是低层使用了ptlib,虽然多平台下都很好用,但放在嵌入式下感觉稍庞大了一些。pjsip精巧,方便移植,嵌入式下应该是首选。不过视频频支持方面扩展起来比opal麻烦。个人感觉,对于windows开发者来说,pjsip最大的好处就是代码调试方便。整个工程一次编译通过,另外两个库还要找很多相关的资源
。
3、其他的一些协议栈也调试过,比如reSipphone,好象是这个名字,还有Yate,不过从快速开发角度看,都不太合适。现在搞sip开发的,一开始就是先找好协议栈。linphone,ekiga什么的,但庞大。对于刚开始做的,最好是一个精简的demo。后来找到pjsip下面的几个例子,慢慢地了解了sip的工作流程,当然少不了抓包工具和tcpmp。
不过,其实,sip没有想象中的那么麻烦。现在回头看,刚开始做项目,使用协议栈绝对不是好想法。如果换个方向,先熟悉SIP基本协议,然后自己改造一个,或完全写一个,可能效果更好。
‘贰’ android 网络电话开发,VOIP/SIP 那么多开源选哪个好
觉得好用的是linphone 和csipsimple,linphone的最大优势在于全平台支持,android,ios,winphone,windows,linux,mac osx,web 全都支持,但是质量上还是欠火候,改过他的库,添加过g.729的支持,他的c 代码,命名和缩进都觉得乱。
可能是看过pjsip 的代码,有些情有独钟吧,总之咱非常喜欢pjsip的简洁,高效,代码的设计非常赞,注释文档也很棒,直接用doxygen生成文档。所以自然特别关注了一些csipsimple。
UI上,csipsimple基本就是提取android原生的拨号程序,然后用swig生成的接口。功能的完整性,还是UI都胜过其他那几个开源。所以在android开发上,主要基于csipsimple 做了很多改进。
‘叁’ 如何在 android 设备上使用 pjsip G.729 编解码的功能
第一步是生成 pjsip 为 Android (步骤为 Ubuntu Linux) 的源代码:
设置 ANDROID_NDK_ROOT 环境变量设置为您 NDK 根文件夹。
2.转到 pjsip 2.x 文件夹并创建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )
3.运行./configure-android
4.运行make clean make depend make
之后这些步骤,你将有几个静态库中的几个文件夹。我建议将它们分组相同的文件夹 (最好在您的项目中) 中的:
mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
一旦你的所有库,您需要将这些库添加到您的项目 Android.mk 文件,这是由包括一个新的模块节每个图书馆。此模块部分应该是一样的东西:
include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)
,你其实是一节中构建您的 JNI 项目的源代码,所有模块都添加到您的静态库的引用:
LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi
这将包括 pjsip 的引用加入您的 JNI 库。现在,您需要配置 pjsip UA 实例。
你有一个关于 init 和开始的解释 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步骤是:
创建一个具有 UA 实例pjsua_create
2.创建一个工作线程与pj_thread_create
3.UA 实例的设置的默认配置:
pjsua_config cfg 桩 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;
pj_cli_cfg_default(app_config.cli_cfg.cfg) ;pjsua_logging_config_default(log_cfg) ;pjsua_media_config_default(media_cfg) ;
4.初始化堆栈与pjsua_init
5.启动与堆栈pjsua_start
从这里,你有充足的配置选项 (日志、 媒体、 交通工具等)
您可以找到基本 PJSIP 教程在这里,和里面 pjsip 的源的根路径,你有一个基本 (但不够完整,基本的 SIP 使用情况) 在:pjsip-apps/src/samples/simple_pjsua.c
编辑:在生成时在 pjsip 应用程序的 android 项目,你可以面临一个问题,因为 pjsua app 不生成默认情况下,对一般生成 (更具体地说,pjsua: 目标不包括所有上: 在 pjsip-应用程序/生成/生成文件的目标)。若要修复这只是转到 pjsip-应用程序/创建和运行:
使 pjsua
这将创建在正确的对象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要构建 android 样本时)。
一旦你所有相应的对象文件,您可以在 pjsip-应用程序/src/pjsua/android 系统再次运行 ndk 生成
‘肆’ 如何在 android 设备上使用 pjsip G.729 编解码的功能
第一步是生成 pjsip 为 Android (步骤为 Ubuntu Linux) 的源代码:
1.设置 ANDROID_NDK_ROOT 环境变量设置为您 NDK 根文件夹。
2.转到 pjsip 2.x 文件夹并创建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )
3.运行./configure-android
4.运行make clean && make depend && make
之后这些步骤,将有几个静态库中的几个文件夹。建议将它们分组相同的文件夹 (最好在您的项目中) 中的:
mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
一旦自己的所有库,您需要将这些库添加到您的项目 Android.mk 文件,这是由包括一个新的模块节每个图书馆。此模块部分应该是一样的东西:
include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)
,其实是一节中构建您的 JNI 项目的源代码,所有模块都添加到您的静态库的引用:
LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...
这将包括 pjsip 的引用加入您的 JNI 库。现在,您需要配置 pjsip UA 实例。
有一个关于 init 和开始的解释 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步骤是:
1.创建一个具有 UA 实例pjsua_create
2.创建一个工作线程与pj_thread_create
3.UA 实例的设置的默认配置:
pjsua_config cfg 桩 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;
pj_cli_cfg_default(&app_config.cli_cfg.cfg) ;pjsua_logging_config_default(&log_cfg) ;pjsua_media_config_default(&media_cfg) ;
4.初始化堆栈与pjsua_init
5.启动与堆栈pjsua_start
从这里,有充足的配置选项 (日志、 媒体、 交通工具等)
您可以找到基本 PJSIP 教程在这里,和里面 pjsip 的源的根路径,有一个基本 (但不够完整,基本的 SIP 使用情况) 在:pjsip-apps/src/samples/simple_pjsua.c
编辑:在生成时在 pjsip 应用程序的 android 项目,可以面临一个问题,因为 pjsua app 不生成默认情况下,对一般生成 (更具体地说,pjsua: 目标不包括所有上: 在 pjsip-应用程序/生成/生成文件的目标)。若要修复这只是转到 pjsip-应用程序/创建和运行:
使 pjsua
这将创建在正确的对象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要构建 android 样本时)。
一旦所有相应的对象文件,您可以在 pjsip-应用程序/src/pjsua/android 系统再次运行 ndk 生成
‘伍’ pjsip 嵌入式 必须有系统吗
想把pjsip移植到嵌入式Linux下,该设备有多个fxs/fxo端口,每个端口对应一个dsp通道。pjsip目前只是对声卡类设备进行支持,实现的pjsua也仅仅对一个声卡设备支持,并不支持多端口。
在移植中,可以考虑如下方法:
1、把每个fxs/fxo端口对应的dsp通道适配成一个声卡设备,对pjsua改造,呼叫的时候,指定使用哪一个音频设备
方法好处就是完全支持pjmedia现有的媒体框架,基本不改动原有流程和代码。
pjsip库升级时,原有自己实现的设备不受影响
2、在pjsip代码中进行拦截,拦截收发报文时决定使用的那个通道
该方法修改了pjsip流程,在以后pjsip库需要升级时,需要同步修改
3、把整个dsp适配成一个声卡设备,扩展参数,来通知dsp使用哪个通道
该方法同样要修改pjsip代码,对以后升级不利
因此,最好的方法,就是把dsp的每个通道适配成一个音频设备,混音功能同样适配成mix设备。
pjsip目前还不支持特性 收藏
1、sip info方式dtmf接收
2、call waiting
3、t38传真
4、t30传真
5、digitmap
6、call parking
这些在pjsip的简单的uaapp中都没有,需要自己实现。可以使用pjsip-ua,pjsip lib自己实现ua或者在现有ua上进行扩充。
‘陆’ linux 中pjsip中怎么增加音频编码方式g729
第一步是生成 pjsip 为 Android (步骤为 Ubuntu Linux) 的源代码:
设置 ANDROID_NDK_ROOT 环境变量设置为您 NDK 根文件夹。
2.转到 pjsip 2.x 文件夹并创建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )
3.运行./configure-android
4.运行make clean make depend make
之后这些步骤,将有几个静态库中的几个文件夹。建议将它们分组相同的文件夹 (最好在您的项目中) 中的:
mkdir <your_project_path>/pjsip_libs
find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/
一旦自己的所有库,您需要将这些库添加到您的项目 Android.mk 文件,这是由包括一个新的模块节每个图书馆。此模块部分应该是一样的东西:
include $(CLEAR_VARS)
LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi
LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a
include $(PREBUILT_STATIC_LIBRARY)
,其实是一节中构建您的 JNI 项目的源代码,所有模块都添加到您的静态库的引用:
LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi
这将包括 pjsip 的引用加入您的 JNI 库。现在,您需要配置 pjsip UA 实例。
有一个关于 init 和开始的解释 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步骤是:
创建一个具有 UA 实例pjsua_create
2.创建一个工作线程与pj_thread_create
3.UA 实例的设置的默认配置:
pjsua_config cfg 桩 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;
pj_cli_cfg_default(app_config.cli_cfg.cfg) ;pjsua_logging_config_default(log_cfg) ;pjsua_media_config_default(media_cfg) ;
4.初始化堆栈与pjsua_init
5.启动与堆栈pjsua_start
从这里,有充足的配置选项 (日志、 媒体、 交通工具等)
您可以找到基本 PJSIP 教程在这里,和里面 pjsip 的源的根路径,有一个基本 (但不够完整,基本的 SIP 使用情况) 在:pjsip-apps/src/samples/simple_pjsua.c
编辑:在生成时在 pjsip 应用程序的 android 项目,可以面临一个问题,因为 pjsua app 不生成默认情况下,对一般生成 (更具体地说,pjsua: 目标不包括所有上: 在 pjsip-应用程序/生成/生成文件的目标)。若要修复这只是转到 pjsip-应用程序/创建和运行:
使 pjsua
这将创建在正确的对象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要构建 android 样本时)。
一旦所有相应的对象文件,您可以在 pjsip-应用程序/src/pjsua/android 系统再次运行 ndk 生成
‘柒’ webrtc linphone 到底哪个
最新要做一个移动端视频通话软件,大致看了下现有的开源软件
一) sipdroid
1)架构
sip协议栈使用java实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器)实现。NAT传输支持stun server.
2)优缺点:
NAT方面只支持STUN,无ICE框架,如需要完全实现P2P视频通话需要实现符合ICE标准的客户端,音频方面没看到AEC等技术,视频方面还不是太完善,目前只看到调用的是系统自带的MediaRecorder,并没有自己的第三方音视频编解码库。
3)实际测试:
基于sipdroid架构的话,我们要做的工作会比较多,(ICE支持,添加回音消除,NetEQ等gips音频技术,添加视频硬件编解码codec.),所以就不做测试了。
二) imsdroid
1)架构:
基于doubango(Doubango 是一个基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架。该框架使用ANSCI-C编写,具有很好的可移植性。并且已经被设计成非常轻便且能有效的工作在低内存和低处理能力的嵌入式系统上。苹果系统上的idoubs功能就是基于此框架编写) .音视频编码格式大部分都支持(H264(video),VP8(video),iLBC(audio),PCMA,PCMU,G722,G729)。NAT支持ICE(stun+turn)
2)效果实测
测试环境:公司局域网内两台机器互通,服务器走外网sip2sip
音频质量可以,但是AEC打开了还是有点回音(应该可以修复)。视频马赛克比较严重,延迟1秒左右。
3)优缺点
imsdroid目前来说还是算比较全面的,包括音视频编解码,传输(RTSP,ICE),音频处理技术等都有涉猎。doubango使用了webrtc的AEC技术,但是其调用webrtc部分没有开源,是用的编译出来的webrtc的库。如果要改善音频的话不太方便,Demo的音频效果可以,视频效果还是不太理想。
三)csipsimple
1)sip协议栈用的是pjsip,音视频编解码用到的第三方库有ffmpeg(video),silk(audio),webrtc.默认使用了webrtc的回声算法。支持ICE协议。
2)优缺点:
csipsimple架构比较清晰,sip协议由C实现,java通过JNI调用,SIP协议这一块会比较高效。其VOIP各个功能也都具备,包括NAT传输,音视频编解码。并且该项目跟进新技术比较快,官方活跃程度也比较高。如果做二次开发可以推荐这个。
3)实测效果
测试环境:公司局域网内两台机器互通,服务器走外网sip2sip
音频质量可以,无明显回音,视频需要下插件,马赛克比imsdroid更严重。
四)Linphone
这个是老牌的sip,支持平台广泛 windows, mac,ios,android,linux,技术会比较成熟。但是据玩过的同事说linphone在Android上的bug有点多,由于其代码实在庞大,所以我暂时放弃考虑Linphone.不过如果谁有跨平台的需要,可以考虑Linphone或者imsdroid和下面的webrtc.。。。好像现在开源软件都跨平台了。。。
五) webrtc
imsdroid,csipsimple,linphone都想法设法调用webrtc的音频技术,本人也测试过Android端的webrtc内网视频通话,效果比较满意。但是要把webrtc做成一个移动端的IM软件的话还有一些路要走,不过webrtc基本技术都已经有了,包括p2p传输,音视频codec,音频处理技术。不过其因为目前仅支持VP8的视频编码格式(QQ也是)想做高清视频通话的要注意了。VP8在移动端的硬件编解码支持的平台没几个(RK可以支持VP8硬件编解码)。不过webrtc代码里看到可以使用外部codec,这个还是有希望调到H264的。
总结:sipdroid比较轻量级,着重基于java开发(音频codec除外),由于其音视频编码以及P2P传输这一块略显不足,不太好做定制化开发和优化。imsdroid,遗憾就是直接调用webrtc的库,而最近webrtc更新的比较频繁,开发比较活跃。如果要自己在imsdroid上更新webrtc担心兼容性问题,希望imsdroid可以直接把需要的webrtc相关源码包进去。csipsimple的话,都是围绕pjsip的,webrtc等都是以pjsip插件形式扩充的,类似gstreamer. webrtc如果有技术实力的开发公司个人还是觉得可以选择这个来做,一个是google的原因,一个是其视频通话相关关键技术都比较成熟的原因。个人觉得如果能做出来,效果会不错的。
‘捌’ 编译运行pjsip的sample出现问题
修改config_site.h文件 在pjproject-2.4.5\pjlib\include\pj目录下 增加 #define PJMEDIA_AUDIO_DEV_HAS_ALSA 1
‘玖’ 通过ndk移植pjsip协议到android上出现error: undefined reference to 'srand'
这个属于ndk r10升级后代码的bug,建议换成旧版的ndk r9后在试试,
希望对你有用,我是ndk吧吧主,有问题可以ndk吧留言,谢谢!