关于VoIP音视频开发<一>

一提到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服务器端。
-------
      欢迎交流。由于工作的原因,我可能不定期修改更新。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容