【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

轉自:https://rtcdeveloper.com/t/topic/16586

目錄

1、基於聲網的音視頻SDK和FreeSWITCH開發WebRTC2SIP Gateway 方案和思路

2、基於聲網的音視頻SDK和FreeSWITCH開發WebRTC2SIP Gateway報文設計

1、基於聲網的音視頻SDK和FreeSWITCH開發WebRTC2SIP Gateway 方案和思路

爲什麼做這個?

今年初接到一個項目任務,客戶要求在自己的音視頻平臺系統中集成webrtc功能(原系統是基於SIP協議開發的,已經穩定運行多年,已有一定數量的存量客戶)。在對比多家RTC產品的效果後,客戶對聲網音視頻DEMO效果後非常滿意,指定要求用聲網的SD-RTN傳輸網絡,全面改造客戶端軟件,改善音頻通話質量。據客戶實測,在某些國家和地區,同樣網絡環境下比微信的音頻通話質量要好很多,比如在東非和中國之間語音通話,延遲很小、聲音也更清晰。

目前系統已經上線運行了幾個月沒出過問題,通話質量也非常好,滿足了客戶的預期目標。公司要求總結開發階段中碰到的問題,聲網的小夥伴也說,我們公司的策略是培養ISV,把你們培養起來,做出解決方案,然後也希望能回饋一下社區,形成一個良性互動及不斷加強一下社區濃厚的學習交流氛圍。有感於這一段時間的開發工作,於是寫下這篇文章,我們會在這篇帖子中定期更新,分享開發思路、方案、遇到的問題、解決方法,希望能對大家有所幫助。我會敲代碼,不太會表達,如果大家在實現這個模塊的過程中也碰到類似的問題,想了解一些細節,歡迎聯繫回帖提問或者郵箱交流(交流郵箱地址:[email protected]),咱們儘量答覆大家,也歡迎大家來咱們的官網上看下產品的詳細介紹哈:www.webrtc2sip.com、www.fsgui.com

一路走來,幾個同事經常分析代碼到半夜。終於在測試4個月後穩定下來。其實現在回頭看,就是因爲沒有吃透聲網的API文檔,沒有好好利用社區的功能。如果你碰到的坑是跟咱們的類似,那麼花點時間仔細擼幾遍API文檔就可以搞掂了。

話不多說,先列下客戶需求:

1、全面改造Android、iOS、Windows、MacOS、Web版5個平臺的客戶端軟件,原來的客戶端分別是基於Pjsip、Linphone、Sipjs開發的;

2、要求在網絡環境差的地方,也能滿足清晰語音通話的要求(聲網的音視頻實時傳輸網提供支持);

3、最小侵入性,儘量不改變服務器端的系統功能,實現客戶無感升級;

4、解決SIP協議常碰到的丟包、被過濾UDP、無法呼叫和呼叫聽不清等問題;

5、解決SIP服務器經常被嘗試呼叫、惡意掃描註冊等行爲,提高系統穩定性;

6、實現WebRTC協議和SIP協議的雙向互通,既要兼容SIP呼叫,又支持RTC客戶端送呼叫到SIP Server,也要支持SIP Server呼入到客戶端軟件(在聲網的音視頻實時傳輸網傳輸)。.

其實剛接到需求的時候,大家一起討論分析過:這種項目看着有不少預算,但是要做全平臺客戶端,開發任務繁重,要考慮的細節也比較多,沒準是個坑,能否達到客戶的期望要打一個問號,因此多數同事建議不做。然後在領導和客戶一起去happy一晚後,這活兒不知道怎麼就接下來了。

老闆理由很簡單,這也不做那也不做,那我們可以做什麼?如果誰都能做,客戶還會找我們嗎?那就幹吧,馬上行動,各種查資料,翻閱聲網的技術開發文檔,並諮詢聲網的技術同學,2天后拿出初步方案。

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

系統架構圖

解決思路有6步:

1、自己寫信令模塊,保持靈活性,簡單實現。開發TCP Server承擔信令服務器;

2、核心是開發一個SIP2WebRTC/WebRTC2SIP協議轉換網關,維護一個狀態機;

3、開發音視頻編解碼處理器,解決聲網語音和SIP語音編碼互通;

4、開發一個狀態管理模塊,SessionManger,以維護客戶端的狀態IP和端口;

5、結合聲網的音視頻SDK,集成自己的信令模塊,實現和WebRTC2SIP 模塊通訊;

6、自定義常見的SIP呼叫信令,供各平臺客戶端保持一致。

常用的SIP 信令有:1註冊、2呼叫、3接聽、4掛斷、5拒接、6取消、7Hold、8DTMF、9用戶未反映、10用戶離線、11Transfer、12會議(我會簡單介紹前面的6個)。

PS:我們暫且把這個系統命名爲 WebRTC2SIP Connector 或者SIP2WebRTC Connector吧。至於爲什麼這麼叫,我也不知道,可能叫XX Gateway的太多了,不這麼叫顯不出聲網的SD-RTN有多厲害,我是他爹,想叫什麼都可以,哈哈

理清思路後,我們需要確認幾個核心問題:

  1. 以哪個平臺的SDK爲基礎開發WebRTC2SIP Connector核心模塊?

  2. Agora SDK是否支持多併發呼叫?

  3. 聲網的語音編碼格式和視頻編碼格式是什麼?採樣率多少?

  4. SIP客戶側有沒有什麼具體的編碼要求?客戶可接受固定一個語音編碼,我選擇PCMA

這裏特別感謝一下聲網,對我們這種小衆需求做出了快速響應,也感謝聲網技術支持同學Nemo,專門來到公司交流了幾個小時,並分享了一些技術信息,點一個大大的贊

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

聲網建議我們:

  1. 用Agora Windows SDK 或者 Linux SDK 開發協議轉換模塊;

  2. 2個SDK都支持多併發呼叫;

  3. 語音是pcm格式,視頻是yuv格式,採樣率是48khz;

到這裏心裏有數了,簡要文字描述下大概流程就是:

1、各客戶端SDK啓動時,發起TCP連接,登錄TCP Server信令服務器, WebRTC2SIP轉接模塊初始化也發起TCP連接登錄TCP Server ,由TCP Server記錄UID,IP和端口等信息。

2、呼叫的具體流程大概是這樣的:

(1)呼叫的時候,申請一個房間號,並根據自定義信令格式發起calling 報文,TCP Server收到後,轉發給轉接模塊WebRTC2SIP ;

(2)WebRTC2SIP收到後創建1個線程,解析報文,並啓動聲網的SDK,加入指定房間號;

(3)開始讀取音頻流程,同時啓動線程,封裝SIP標準報文,發起sip invite請求給電話服務器SIP Server;

(4)SIP Server收到呼叫請求就去呼叫被叫電話號碼,並返回ring振鈴信號。

(5)WebRTC2SIP收到振鈴信號,封裝自定義的振鈴信息給客戶端SDK;

(6)被叫接聽後,WebRTC2SIP,啓動Media Coder開始解析媒體流,並resample 後,寫入到聲網的房間裏面。實現語音通話。

3、從SIP呼入到聲網的SDK,大同小異,反過來就行。

這裏要注意:

1、每個終端都要自定義編號;

2、每個呼叫都要加入聲網的房間channel 實現音視頻互通;

3、因爲編碼不一樣,所以需要resample,這個很重要,不然接通了沒有聲音,雙方不匹配。

4、WebRTC2SIP模塊要多線程方式處理,以實現併發呼叫;

5、WebRTC2SIP模塊要維護一個完整的狀態機,給每個通話加唯一編號,避免出錯。

到現在我們講清楚了大概的解決方案和技術思路,看到這裏,各位客官應該明白了,其實這個做起來沒啥難度,至少現在看來是這樣的。

2、基於聲網的音視頻SDK和FreeSWITCH開發WebRTC2SIP Gateway報文設計

上一篇我們提到,常用的SIP 信令有:1註冊、2振鈴、3呼叫、4接聽、5掛斷、6取消

有了這幾個報文,電話的呼入和呼出就可以基本實現,其他拒接、DTMF等類似。

如圖所示:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

約定:

  1. 客戶端和服務器端JSON格式交互;

必傳參數:msgtag 是消息唯一標誌,userid是誰觸發的,appid 作爲一個應用的標記。sign 簽名加密 (看情況)

  1. 服務器返回的報文必須包括msgtag \appid\errcode

errcode=1 說明有錯誤 errmsg就會有值 ,如果errcode=0 說明返回結果正確一般是返回的msgtag 是請求的msgtag+”_res”做爲區分

  1. roomID 是房間號,對應聲網的渠道號channel ID,每個通話報文必須包括roomID 用途是什麼自己想。

  2. callType 是video \ audio前者代表視頻呼叫,後者代表語音呼叫

  3. direction 呼叫方向in呼入 (SIP Server 把呼叫送到聲網的SDK)out呼出(聲網的SDK把呼叫送到SIP Server)

  4. isSIP YES / NO代表這通呼叫是內部呼叫(聲網客戶端實現) 還是SIP呼叫(走落地)

這篇文章我只是簡單列出核心的報文DEMO格式。

信令1:註冊報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

信令2:呼叫報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

信令3:振鈴報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

信令4:接聽報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

信令5:掛斷報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

信令6:取消報文

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

響應報文:

【長期分享貼】基於聲網音視頻SDK開發WebRTC2SIP Gateway的思路和步驟,一路填坑走出

如上圖設計的報文非常簡單,不需要過多言語說明,供大家參考吧。

後續處理

不論客戶端還是WebRTC2SIP Connector本質上都是聲網的音視頻SDK客戶端,然後集成了自定義的信令報文,所以在初始化時,需要調用一個專門的的接口(暫時叫做initSIP),調用這個接口時傳遞type類型參數。

(1)如果是手機端或者電腦端、網頁端調用,返回TCP Server地址和端口,供他們建立TCP連接。

(2)如果是Connector轉接服務器請求,除了返回TCP Server地址和端口外,還要返回SIP Serve地址及端口和呼叫送號前綴。不然SDK發起電話呼叫時,Connector不知道電話要轉送到哪裏。這個開發一個http接口就可以實現。

APP初始化,調用initSIP接口,建立TCP連接,或者呼叫的時候在建立TCP連接;

TCP Server維持所有終端的狀態及網絡位置做Session Manager角色;

主叫輸入的號碼編輯封裝calling報文,通過tcp socket發給服務器,同時UI呈現撥號等待頁面;

被叫收到calling報文,就封裝ringing報文,通過tcp socket 發給服務器,服務器查詢Session Manager查詢主被叫的IP和端口,實現消息的路由轉發,主叫收到就顯示振鈴頁面。同時WebRTC2SIP Connector啓動Media coder線程去解析和resample讀取到的音頻流。就這樣一個個的報文交互串起來,就可以實現整個SIP呼叫邏輯。

有興趣的同學,快去試試吧。

歡迎聯繫回帖提問或者郵箱交流(交流郵箱地址:[email protected]),咱們儘量答覆大家,也歡迎大家來咱們的官網上看下產品的詳細介紹哈:www.webrtc2sip.com、www.fsgui.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章