一提到VoIP有人就想到了網(wǎng)絡(luò)電話鼻听,是沒(méi)錯(cuò)编检,但網(wǎng)絡(luò)電話只是VoIP應(yīng)用的一種渡贾,也是最初設(shè)計(jì)VoIP的目的◎茸ィ現(xiàn)在運(yùn)營(yíng)商針對(duì)3G/4G提出的VoLTE其實(shí)跟VoIP有很大聯(lián)系庆尘,VoIP顧名思義基于IP網(wǎng)絡(luò)的語(yǔ)音,這個(gè)網(wǎng)絡(luò)包括寬帶光纖巷送、局域網(wǎng)驶忌、廣域網(wǎng)、移動(dòng)網(wǎng)絡(luò)等笑跛,適應(yīng)性很強(qiáng)付魔,而VoLTE其實(shí)就是基于LTE移動(dòng)網(wǎng)絡(luò)的語(yǔ)音。眾所周知3G/4G網(wǎng)絡(luò)本身只承載流量數(shù)據(jù)的飞蹂,以至于不支持VoLTE的手機(jī)通話時(shí)必須回落到GSM(2G)網(wǎng)絡(luò)上几苍,可以說(shuō)VoLTE也是基于VoIP開(kāi)發(fā)的移動(dòng)語(yǔ)音技術(shù)。
這篇文章從答應(yīng)到寫(xiě)開(kāi)始寫(xiě)整整拖了大半年陈哑, 我不得不承認(rèn)我很懶妻坝,忙起來(lái)也確實(shí)不喜歡寫(xiě)東西。在通信和多媒體方面工作了幾年惊窖,也開(kāi)發(fā)了一些亂七八糟的玩意兒惠勒,包括網(wǎng)絡(luò)電話、SDK爬坑。所以這次就主要聊一下基于SIP協(xié)議的VoIP網(wǎng)絡(luò)應(yīng)用纠屋。
什么是VoIP?
VoIP(Voice over Internet Protocol)簡(jiǎn)而言之就是將模擬信號(hào)數(shù)字化盾计,以數(shù)據(jù)封包(Data Packet)的形式在IP網(wǎng)絡(luò)(IP Network)上做實(shí)時(shí)傳遞售担。VoIP最大的優(yōu)勢(shì)是能廣泛地采用Internet和全球IP互連的環(huán)境,提供比傳統(tǒng)業(yè)務(wù)更多署辉、更好的服務(wù)族铆。
VoIP可以在IP網(wǎng)絡(luò)上便宜的傳送語(yǔ)音、傳真哭尝、視頻哥攘、和數(shù)據(jù)等業(yè)務(wù),如虛擬電話材鹦、虛擬語(yǔ)音/傳真郵箱逝淹、查號(hào)業(yè)務(wù)、Internet呼叫中心桶唐、Internet呼叫管理栅葡、電話視頻會(huì)議、傳真存儲(chǔ)轉(zhuǎn)發(fā)和各種信息的存儲(chǔ)轉(zhuǎn)發(fā)等尤泽。
VoIP基本原理
VoIP是一種以IP電話為主欣簇,并推出相應(yīng)的增值業(yè)務(wù)的技術(shù)规脸。
是通過(guò)語(yǔ)音的壓縮算法對(duì)語(yǔ)音數(shù)據(jù)編碼進(jìn)行壓縮處理,然后把這些語(yǔ)音數(shù)據(jù)按 TCP/IP 標(biāo)準(zhǔn)進(jìn)行打包熊咽,經(jīng)過(guò)IP網(wǎng)絡(luò)把數(shù)據(jù)包送至接收地莫鸭,再把這些語(yǔ)音數(shù)據(jù)包串起來(lái),經(jīng)過(guò)解壓處理后横殴,恢復(fù)成原來(lái)的語(yǔ)音信號(hào)被因,從而達(dá)到由互聯(lián)網(wǎng)傳送語(yǔ)音的目的。IP 電話的核心與關(guān)鍵設(shè)備是 IP 網(wǎng)關(guān)滥玷,它把各地區(qū)電話區(qū)號(hào)映射為相應(yīng)的地區(qū)網(wǎng)關(guān) IP 地址氏身。
VoIP主要的三種應(yīng)用形式:
- 網(wǎng)絡(luò)電話:完全基于Internet傳輸實(shí)現(xiàn)的語(yǔ)音通話方式,包括是PC和PC之間惑畴、PC與手機(jī)APP蛋欣、手機(jī)APP之間進(jìn)行通話。比如QQ音頻如贷、WhatsApp陷虎、微信電話等;
- 與公眾電話網(wǎng)互聯(lián)的IP電話:通過(guò)寬帶或?qū)S玫腎P網(wǎng)絡(luò)杠袱,實(shí)現(xiàn)語(yǔ)音傳輸尚猿。終端可以是PC或者專(zhuān)用的IP話機(jī)。當(dāng)VoIP網(wǎng)絡(luò)語(yǔ)音系統(tǒng)接入PSTN電路交換網(wǎng)絡(luò)楣富,也就是說(shuō)可以透?jìng)鞯狡胀℅SM電話了凿掂,實(shí)現(xiàn)落地,直接從因特網(wǎng)VoIP連通到SIM電話纹蝴,現(xiàn)在很多網(wǎng)絡(luò)電話都可以透?jìng)髀涞刈1热鏢kype、UUtone塘安、Viber糠涛、有信等;
- 傳統(tǒng)電信運(yùn)營(yíng)商的VoIP業(yè)務(wù):通過(guò)電信運(yùn)營(yíng)商的PLMN移動(dòng)網(wǎng)絡(luò)傳輸語(yǔ)音兼犯。提供的業(yè)務(wù)仍然是傳統(tǒng)的電話業(yè)務(wù)忍捡,使用傳統(tǒng)的話機(jī)終端。通過(guò)使用IP電話卡切黔,或者在撥打的電話號(hào)碼之前加上IP撥號(hào)前綴砸脊,這就使用了電信運(yùn)營(yíng)商提供的VoIP業(yè)務(wù)。如中國(guó)移動(dòng)曾經(jīng)的Jego绕娘、現(xiàn)在的VoLTE 等脓规。
常用的VoIP協(xié)議(Control Protocol)如H.323、SIP险领、MEGACO和MGCP侨舆。
- H.323是一種ITU-T標(biāo)準(zhǔn),最初用于局域網(wǎng)(LAN)上的多媒體會(huì)議绢陌,后來(lái)擴(kuò)展至覆蓋VoIP挨下。該標(biāo)準(zhǔn)既包括了點(diǎn)對(duì)點(diǎn)通信也包括了多點(diǎn)會(huì)議。
- 會(huì)話發(fā)起協(xié)議(SIP)是建立VoIP連接的IETF標(biāo)準(zhǔn)脐湾。SIP是一種應(yīng)用層控制協(xié)議臭笆,用于和一個(gè)或多個(gè)參與者創(chuàng)建、修改和終止會(huì)話秤掌。
- 媒體網(wǎng)關(guān)控制協(xié)議(MGCP)定義了呼叫控制單元(呼叫代理或媒體網(wǎng)關(guān))與電話網(wǎng)關(guān)之間的通信服務(wù)愁铺。
- 媒體網(wǎng)關(guān)控制協(xié)議(MEGACO)是IETF和ITU-T(ITU-TH.248建議)共同努力的結(jié)果。
H.323建議中定義了四個(gè)主要的組件:即
- 終端:(Terminal)--須支持語(yǔ)音通信闻鉴,視頻和數(shù)據(jù)通信能力是可選的茵乱。
- 網(wǎng)關(guān):(Gateway)能把不同系統(tǒng)所用的協(xié)議、音頻孟岛、視頻編碼算法以及控制信號(hào)進(jìn)行變換以適應(yīng)系統(tǒng)終端互通瓶竭。
- 關(guān)守:(Gatekeeper)網(wǎng)關(guān)管理軟件(也叫網(wǎng)閘)
- 多點(diǎn)控制單元(Multipoint Control Unit)--MCU實(shí)現(xiàn)了在IP網(wǎng)絡(luò)上進(jìn)行多點(diǎn)通信,點(diǎn)到點(diǎn)的通信并不需要渠羞。
網(wǎng)絡(luò)電話的工作原理
和GSM語(yǔ)音網(wǎng)絡(luò)類(lèi)似斤贰,網(wǎng)絡(luò)電話也是有自己的語(yǔ)音編碼(關(guān)乎音頻質(zhì)量和帶寬占用)和信令控制(音頻狀態(tài)捕捉和操作命令)。
常見(jiàn)VoIP音頻編碼有silk次询、ilbc荧恍、G7.29、G7.22屯吊、AAC送巡、PCMU以及大眾熟知的GSM等,而與我們常說(shuō)的音頻文件編碼格式MP3、APE雌芽、OGG授艰、WMA等文件格式是有區(qū)別的.
在網(wǎng)絡(luò)中傳輸著各種信號(hào),其中一部分是我們需要的(例如打電話的語(yǔ)音世落,上網(wǎng)的數(shù)據(jù)包等等)淮腾,而另外一部分是我們不需要的(只能說(shuō)不是直接需要)它用來(lái)專(zhuān)門(mén)控制電路的,這一類(lèi)型的信號(hào)我們就稱(chēng)之為信令屉佳,信令的傳輸需要一個(gè)信令網(wǎng)谷朝。信令控制無(wú)論是在VoIP還是傳統(tǒng)GSM電話上都有著重要的作用(控制系統(tǒng)在哪都很重要),比如電話連通狀態(tài)武花、DTMF等圆凰。
關(guān)于SIP協(xié)議
SIP(Session Initiation Protocol,會(huì)話初始協(xié)議)是由IETF(Internet Engineering Task Force体箕,因特網(wǎng)工程任務(wù)組)制定的多媒體通信協(xié)議专钉。它是一個(gè)基于文本的應(yīng)用層控制協(xié)議挑童,用于創(chuàng)建、修改和釋放一個(gè)或多個(gè)參與者的會(huì)話跃须。廣泛應(yīng)用于CS(Circuit Switched站叼,電路交換)、NGN(Next Generation Network菇民,下一代網(wǎng)絡(luò))以及IMS(IP Multimedia Subsystem尽楔,IP多媒體子系統(tǒng))的網(wǎng)絡(luò)中,可以支持并應(yīng)用于語(yǔ)音第练、視頻阔馋、數(shù)據(jù)等多媒體業(yè)務(wù)娇掏,同時(shí)也可以應(yīng)用于Presence(呈現(xiàn))呕寝、Instant Message(即時(shí)消息)等特色業(yè)務(wù)【园可以說(shuō)志秃,有IP網(wǎng)絡(luò)的地方就有SIP協(xié)議的存在竟坛。 SIP是類(lèi)似于HTTP担汤。由于基于IP協(xié)議的SIP利用了IP網(wǎng)絡(luò)崭歧,固定網(wǎng)運(yùn)營(yíng)商也會(huì)逐漸認(rèn)識(shí)到SIP技術(shù)對(duì)于他們的遠(yuǎn)意義率碾。
本次我也主要說(shuō)一下給予sip協(xié)議的VoIP開(kāi)發(fā),畢竟目前基于sip協(xié)議的VoIP是應(yīng)用最廣泛的。SIP 會(huì)話使用多達(dá)四個(gè)主要組件:SIP 用戶代理、SIP 注冊(cè)服務(wù)器、SIP 代理服務(wù)器和 SIP 重定向服務(wù)器。
SIP通過(guò)以下邏輯功能來(lái)完成通信:
- 用戶定位功能:確定參與通信的終端用戶位置谭羔。
- 用戶通信能力協(xié)商功能:確定參與通信的媒體終端類(lèi)型和具體參數(shù)磕蛇。
- 用戶是否參與交互功能:確定某個(gè)終端是否加入某個(gè)特定會(huì)話中。
- 建立呼叫和控制呼叫功能:包括向被叫“振鈴”秀撇、確定主叫和被叫的呼叫參數(shù)呵燕、呼叫重定向再扭、呼叫轉(zhuǎn)移泛范、終止呼叫等罢荡。
關(guān)于在iOS上開(kāi)發(fā)和適配VoIP應(yīng)用及注意事項(xiàng)
近觀這幾年互聯(lián)網(wǎng)高速發(fā)展区赵,很多之前很獨(dú)特的功能都已經(jīng)被迅速囫圇吞棗的普及了,比如在線音頻、視頻、直播到千、短視頻...... 馬上VR憔四、AR又要普及了甸赃。工作了幾年埠对,原本以為可以安安靜靜慢慢研究一個(gè)東西襟沮,可是越來(lái)越感覺(jué)沒(méi)時(shí)間去跟上潮流節(jié)奏。一個(gè)不得不承認(rèn)的事實(shí)是遭商,精力有限的個(gè)體很難在技術(shù)深度和廣度上達(dá)成理想的平衡固灵,所以我越來(lái)越懶,懶得花時(shí)間去寫(xiě)網(wǎng)文株婴。每天看到很多人整天在網(wǎng)上轉(zhuǎn)發(fā)各種技術(shù)小貼怎虫,不亦樂(lè)乎,我真的不感興趣困介。這篇文章拖了大半年了大审,目測(cè)得慢慢更新完善。
現(xiàn)在你想開(kāi)發(fā)和集成VoIP功能座哩,無(wú)非有兩種:使用成熟的第三方庫(kù)徒扶,或者有精力去自己找資料從基礎(chǔ)研究。成熟的第三方庫(kù)其實(shí)很多根穷,除了開(kāi)源姜骡、開(kāi)放的比如PJsip、linphone等屿良,國(guó)內(nèi)也有很多IM-VoIP廠商再封包定制的圈澈。當(dāng)然我自己也曾基于以上開(kāi)源項(xiàng)目制作過(guò)VoIP的SDK:XWVoIPKit,已經(jīng)有幾家公司在產(chǎn)品中正在使用尘惧,想要了解試用或者的可以聯(lián)系我康栈。無(wú)論怎樣先粗略說(shuō)一下VoIP最基本的要素,最好自己了解RTP。
- 數(shù)據(jù)打包:打包周期啥么、包大小登舞、數(shù)據(jù)傳輸;
=包長(zhǎng)度×(1/打包周期)
=(Ethernet頭+IP頭+UDP頭+RTP頭+有效載荷)×(1/打包周期)
=(208bit +160bit+64bit+96bit +有效載荷)×(1/打包周期)
=(528bit+(打包周期(秒)×每秒的比特?cái)?shù)))×(1/打包周期)
=( 528 / 打包周期 ) + 每秒比特?cái)?shù)```
* 音頻編解碼:上面說(shuō)了編碼方式很多悬荣,不同的編碼格式?jīng)Q定了數(shù)據(jù)包的不同菠秒。
根據(jù)各種編碼方式,得出:
`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`
根據(jù)實(shí)際使用silk酵熙、ilbc和G729在音質(zhì)、帶寬驰坊、丟包率和運(yùn)算量上的綜合效果比較好,前兩者還是免費(fèi)的哮独,尤其是窄帶ilbc的丟包補(bǔ)償效果在低帶寬網(wǎng)絡(luò)下音質(zhì)效果相當(dāng)不錯(cuò)拳芙。而silk的綜合體驗(yàn)比較出色,據(jù)我所知QQ音頻使用的也是Skype的silk編碼皮璧,只不過(guò)QQ做了一些處理舟扎。
![IMG_3921.PNG](http://upload-images.jianshu.io/upload_images/580038-7db471ccabb4159c.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我知道有人嘗試在局域網(wǎng)內(nèi)做點(diǎn)對(duì)點(diǎn)的IP語(yǔ)音,使用tcp socket直接連接對(duì)方IP悴务,再用udp直接發(fā)送錄制的音頻數(shù)據(jù)包睹限,勉強(qiáng)可以播放,很明顯雜音和丟包嚴(yán)重讯檐。我自己曾經(jīng)也嘗試過(guò)羡疗,因?yàn)榘l(fā)包周期不穩(wěn)定,音頻數(shù)據(jù)也沒(méi)有經(jīng)過(guò)壓縮帶寬負(fù)載大别洪,不可避免地?cái)?shù)據(jù)丟包叨恨、延遲。所以真正做應(yīng)用的時(shí)候還是使用專(zhuān)門(mén)的編解碼方式比較好挖垛。其次痒钝,這種點(diǎn)對(duì)點(diǎn)語(yǔ)音只能用于原理測(cè)試,沒(méi)有服務(wù)器網(wǎng)關(guān)和電路交換痢毒,無(wú)法服務(wù)多方用戶送矩。
還有信令控制的協(xié)議設(shè)計(jì),這個(gè)也很重要哪替,據(jù)我所知linphone的VoIP最大的缺陷在于未接通電話前的信令控制不準(zhǔn)確栋荸,具體表現(xiàn)在拒接來(lái)電操作經(jīng)常無(wú)反應(yīng)。還有就是DTMF(dual-tone multifrequency)功能和控制。
* 關(guān)于純VoIP通信的東西也沒(méi)法在這里深入蒸其。還是說(shuō)一下做sip-VoIP移動(dòng)端開(kāi)發(fā)的事兒敏释。
###### 1. 即時(shí)性保證。
**做通信我們知道保證實(shí)時(shí)性很重要摸袁,時(shí)效不能保障钥顽,基本體驗(yàn)就好不了。我們知道iOS8之前的VoIP推送基本靠APNS通知靠汁,可以嘗試強(qiáng)行申請(qǐng)后臺(tái)蜂大。iOS8~iOS10,蘋(píng)果專(zhuān)門(mén)針對(duì)VoIP搞了個(gè)VoIP證書(shū)蝶怔,對(duì)應(yīng)的有了VoIP推送(pushKit)奶浦,還可以申明VoIP長(zhǎng)連接線程避免被后臺(tái)殺掉。而iOS10起踢星,蘋(píng)果優(yōu)化pushkit澳叉、認(rèn)為VoIP更加可靠和為了省電,不再讓VoIP保存長(zhǎng)連接沐悦,直接使用VoIP推送基本也可以及時(shí)喚醒應(yīng)用了成洗,反正還可以配合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藏否,這個(gè)可選瓶殃。
**iOS10同時(shí)還帶來(lái)了[CallKit](https://github.com/viviwu/XWCallKitDemo),主要有兩個(gè)功能:提升VoIP音頻系統(tǒng)級(jí)別副签,統(tǒng)一普通SIM卡GSM電話和VoIP電話的鎖屏接聽(tīng)體驗(yàn)遥椿;號(hào)碼攔截、識(shí)別(實(shí)現(xiàn)安卓上的黑名單和來(lái)電秀功能淆储,如企鵝冠场、xxx手機(jī)管家)。**
遏考。慈鸠。。灌具。
##### 3.具體的青团,新手可以參考linphone、PJsip等知名的開(kāi)源項(xiàng)目咖楣。后一篇我們聊聊SIP服務(wù)器端督笆。
-------
歡迎交流。由于工作的原因诱贿,我可能不定期修改更新娃肿。