一提到VoIP有人就想到了网络电话,是没错,但网络电话只是VoIP应用的一种,也是最初设计VoIP的目的。现在运营商针对3G/4G提出的VoLTE其实跟VoIP有很大联系,VoIP顾名思义基于IP网络的语音,这个网络包括宽带光纤、局域网、广域网、移动网络等,适应性很强,而VoLTE其实就是基于LTE移动网络的语音。众所周知3G/4G网络本身只承载流量数据的,以至于不支持VoLTE的手机通话时必须回落到GSM(2G)网络上,可以说VoLTE也是基于VoIP开发的移动语音技术。
这篇文章从答应到写开始写整整拖了大半年, 我不得不承认我很懒,忙起来也确实不喜欢写东西。在通信和多媒体方面工作了几年,也开发了一些乱七八糟的玩意儿,包括网络电话、SDK。所以这次就主要聊一下基于SIP协议的VoIP网络应用。
什么是VoIP?
VoIP(Voice over Internet Protocol)简而言之就是将模拟信号数字化,以数据封包(Data Packet)的形式在IP网络(IP Network)上做实时传递。VoIP最大的优势是能广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好的服务。
VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如虚拟电话、虚拟语音/传真邮箱、查号业务、Internet呼叫中心、Internet呼叫管理、电话视频会议、传真存储转发和各种信息的存储转发等。
VoIP基本原理
VoIP是一种以IP电话为主,并推出相应的增值业务的技术。
是通过语音的压缩算法对语音数据编码进行压缩处理,然后把这些语音数据按 TCP/IP 标准进行打包,经过IP网络把数据包送至接收地,再把这些语音数据包串起来,经过解压处理后,恢复成原来的语音信号,从而达到由互联网传送语音的目的。IP 电话的核心与关键设备是 IP 网关,它把各地区电话区号映射为相应的地区网关 IP 地址。
VoIP主要的三种应用形式:
- 网络电话:完全基于Internet传输实现的语音通话方式,包括是PC和PC之间、PC与手机APP、手机APP之间进行通话。比如QQ音频、WhatsApp、微信电话等;
- 与公众电话网互联的IP电话:通过宽带或专用的IP网络,实现语音传输。终端可以是PC或者专用的IP话机。当VoIP网络语音系统接入PSTN电路交换网络,也就是说可以透传到普通GSM电话了,实现落地,直接从因特网VoIP连通到SIM电话,现在很多网络电话都可以透传落地。比如Skype、UUtone、Viber、有信等;
- 传统电信运营商的VoIP业务:通过电信运营商的PLMN移动网络传输语音。提供的业务仍然是传统的电话业务,使用传统的话机终端。通过使用IP电话卡,或者在拨打的电话号码之前加上IP拨号前缀,这就使用了电信运营商提供的VoIP业务。如中国移动曾经的Jego、现在的VoLTE 等。
常用的VoIP协议(Control Protocol)如H.323、SIP、MEGACO和MGCP。
- H.323是一种ITU-T标准,最初用于局域网(LAN)上的多媒体会议,后来扩展至覆盖VoIP。该标准既包括了点对点通信也包括了多点会议。
- 会话发起协议(SIP)是建立VoIP连接的IETF标准。SIP是一种应用层控制协议,用于和一个或多个参与者创建、修改和终止会话。
- 媒体网关控制协议(MGCP)定义了呼叫控制单元(呼叫代理或媒体网关)与电话网关之间的通信服务。
- 媒体网关控制协议(MEGACO)是IETF和ITU-T(ITU-TH.248建议)共同努力的结果。
H.323建议中定义了四个主要的组件:即
- 终端:(Terminal)--须支持语音通信,视频和数据通信能力是可选的。
- 网关:(Gateway)能把不同系统所用的协议、音频、视频编码算法以及控制信号进行变换以适应系统终端互通。
- 关守:(Gatekeeper)网关管理软件(也叫网闸)
- 多点控制单元(Multipoint Control Unit)--MCU实现了在IP网络上进行多点通信,点到点的通信并不需要。
网络电话的工作原理
和GSM语音网络类似,网络电话也是有自己的语音编码(关乎音频质量和带宽占用)和信令控制(音频状态捕捉和操作命令)。
常见VoIP音频编码有silk、ilbc、G7.29、G7.22、AAC、PCMU以及大众熟知的GSM等,而与我们常说的音频文件编码格式MP3、APE、OGG、WMA等文件格式是有区别的.
在网络中传输着各种信号,其中一部分是我们需要的(例如打电话的语音,上网的数据包等等),而另外一部分是我们不需要的(只能说不是直接需要)它用来专门控制电路的,这一类型的信号我们就称之为信令,信令的传输需要一个信令网。信令控制无论是在VoIP还是传统GSM电话上都有着重要的作用(控制系统在哪都很重要),比如电话连通状态、DTMF等。
关于SIP协议
SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。广泛应用于CS(Circuit Switched,电路交换)、NGN(Next Generation Network,下一代网络)以及IMS(IP Multimedia Subsystem,IP多媒体子系统)的网络中,可以支持并应用于语音、视频、数据等多媒体业务,同时也可以应用于Presence(呈现)、Instant Message(即时消息)等特色业务。可以说,有IP网络的地方就有SIP协议的存在。 SIP是类似于HTTP。由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的远意义。
本次我也主要说一下给予sip协议的VoIP开发,毕竟目前基于sip协议的VoIP是应用最广泛的。SIP 会话使用多达四个主要组件:SIP 用户代理、SIP 注册服务器、SIP 代理服务器和 SIP 重定向服务器。
SIP通过以下逻辑功能来完成通信:
- 用户定位功能:确定参与通信的终端用户位置。
- 用户通信能力协商功能:确定参与通信的媒体终端类型和具体参数。
- 用户是否参与交互功能:确定某个终端是否加入某个特定会话中。
- 建立呼叫和控制呼叫功能:包括向被叫“振铃”、确定主叫和被叫的呼叫参数、呼叫重定向、呼叫转移、终止呼叫等。
关于在iOS上开发和适配VoIP应用及注意事项
近观这几年互联网高速发展,很多之前很独特的功能都已经被迅速囫囵吞枣的普及了,比如在线音频、视频、直播、短视频...... 马上VR、AR又要普及了。工作了几年,原本以为可以安安静静慢慢研究一个东西,可是越来越感觉没时间去跟上潮流节奏。一个不得不承认的事实是,精力有限的个体很难在技术深度和广度上达成理想的平衡,所以我越来越懒,懒得花时间去写网文。每天看到很多人整天在网上转发各种技术小贴,不亦乐乎,我真的不感兴趣。这篇文章拖了大半年了,目测得慢慢更新完善。
现在你想开发和集成VoIP功能,无非有两种:使用成熟的第三方库,或者有精力去自己找资料从基础研究。成熟的第三方库其实很多,除了开源、开放的比如PJsip、linphone等,国内也有很多IM-VoIP厂商再封包定制的。当然我自己也曾基于以上开源项目制作过VoIP的SDK:XWVoIPKit,已经有几家公司在产品中正在使用,想要了解试用或者的可以联系我。无论怎样先粗略说一下VoIP最基本的要素,最好自己了解RTP。
- 数据打包:打包周期、包大小、数据传输;
=包长度×(1/打包周期)
=(Ethernet头+IP头+UDP头+RTP头+有效载荷)×(1/打包周期)
=(208bit +160bit+64bit+96bit +有效载荷)×(1/打包周期)
=(528bit+(打包周期(秒)×每秒的比特数))×(1/打包周期)
=( 528 / 打包周期 ) + 每秒比特数```
* 音频编解码:上面说了编码方式很多,不同的编码格式决定了数据包的不同。
根据各种编码方式,得出:
`G711:20ms打包,带宽为 ( 528/20 + 64) Kbit/s=90.4 Kbit/s
G729:20ms打包,带宽为 ( 528/20 + 8 ) Kbit/s= 34.4 Kbit/s
G723:5.3k,30ms打包,带宽为 ( 528/30 + 5.3 ) Kbit/s=22.9 Kbit/s`
根据实际使用silk、ilbc和G729在音质、带宽、丢包率和运算量上的综合效果比较好,前两者还是免费的,尤其是窄带ilbc的丢包补偿效果在低带宽网络下音质效果相当不错。而silk的综合体验比较出色,据我所知QQ音频使用的也是Skype的silk编码,只不过QQ做了一些处理。
![IMG_3921.PNG](http://upload-images.jianshu.io/upload_images/580038-7db471ccabb4159c.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我知道有人尝试在局域网内做点对点的IP语音,使用tcp socket直接连接对方IP,再用udp直接发送录制的音频数据包,勉强可以播放,很明显杂音和丢包严重。我自己曾经也尝试过,因为发包周期不稳定,音频数据也没有经过压缩带宽负载大,不可避免地数据丢包、延迟。所以真正做应用的时候还是使用专门的编解码方式比较好。其次,这种点对点语音只能用于原理测试,没有服务器网关和电路交换,无法服务多方用户。
还有信令控制的协议设计,这个也很重要,据我所知linphone的VoIP最大的缺陷在于未接通电话前的信令控制不准确,具体表现在拒接来电操作经常无反应。还有就是DTMF(dual-tone multifrequency)功能和控制。
* 关于纯VoIP通信的东西也没法在这里深入。还是说一下做sip-VoIP移动端开发的事儿。
###### 1. 即时性保证。
**做通信我们知道保证实时性很重要,时效不能保障,基本体验就好不了。我们知道iOS8之前的VoIP推送基本靠APNS通知,可以尝试强行申请后台。iOS8~iOS10,苹果专门针对VoIP搞了个VoIP证书,对应的有了VoIP推送(pushKit),还可以申明VoIP长连接线程避免被后台杀掉。而iOS10起,苹果优化pushkit、认为VoIP更加可靠和为了省电,不再让VoIP保存长连接,直接使用VoIP推送基本也可以及时唤醒应用了,反正还可以配合apns消息提醒用户。**
![屏幕快照 2017-06-26 下午3.05.40.png](http://upload-images.jianshu.io/upload_images/580038-2a15b7f78d3f6019.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###### 2. 适配CallKit,这个可选。
**iOS10同时还带来了[CallKit](https://github.com/viviwu/XWCallKitDemo),主要有两个功能:提升VoIP音频系统级别,统一普通SIM卡GSM电话和VoIP电话的锁屏接听体验;号码拦截、识别(实现安卓上的黑名单和来电秀功能,如企鹅、xxx手机管家)。**
。。。。
##### 3.具体的,新手可以参考linphone、PJsip等知名的开源项目。后一篇我们聊聊SIP服务器端。
-------
欢迎交流。由于工作的原因,我可能不定期修改更新。