天天看點

基于聲網的音視訊SDK和FreeSWITCH開發WebRTC2SIP Gateway 方案和思路(一)

為什麼做這個?

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

話不多說,先列下客戶要求和目前産品的問題:

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和FreeSWITCH開發WebRTC2SIP Gateway 方案和思路(一)

解決思路:

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個)

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

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

1、 以哪個平台的SDK為基礎開發這個WebRTC2SIP Connector 核心子產品?

2、 Agora SDK是否支援多并發呼叫?

3、 聲網的語音編碼格式和視訊編碼格式是什麼?采樣率多少?

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

這裡特别感謝一下聲網,對我們這種小衆需求做出了快速響應,也感謝聲網技術支援同學Nemo,專門來到公司交流了幾個小時,并分享了一些技術資訊。

他建議我們:

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、呼叫的時候,申請一個房間号,并根據自定義信令格式發起calling 封包,TCP Server收到後,轉發給轉接子產品WebRTC2SIP ,WebRTC2SIP收到後建立1個線程,解析封包,并啟動聲網的SDK,加入指定房間号,開始讀取音頻流程,同時啟動線程,封裝SIP标準封包,發起sip invite請求給電話伺服器SIP Server; SIP Server收到呼叫請求就去呼叫被叫電話号碼,并傳回ring振鈴信号;WebRTC2SIP收到振鈴信号,封裝自定義的振鈴資訊給用戶端SDK,被叫接聽後,WebRTC2SIP,啟動Media Coder開始解析媒體流,并resample 後,寫入到聲網的房間裡面。實作語音通話。描述個大概,相信能看明白。

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

這裡要注意:

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

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

3、因為編碼不一樣,是以需要resample 這個很重要,不要接通了沒有聲音,雙方不比對。

4、WebRTC2SIP 子產品要多線程方式處理,以實作并發呼叫;

5、WebRTC2SIP 子產品要維護一個完整的狀态機,給每個通話加唯一編号,不至于出錯。

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

繼續閱讀