WebRTC的apprtc和collider源碼分析

apprtc和collider是WebRTC的官方例子, 源碼在https://github.com/webrtc/apprtc
其中apprtc是房間服務器, collider是信令服務器. 想搞清楚到底是怎麼回事還是自己看源碼最清楚.
apprtc是基於 Google App Engine SDK for Python編寫的, 而且還需要Node.js和 Grunt, 實在不想折騰這個環境, 還是直接就看看代碼吧.
因爲實在去懶得了解Google App Engine SDK for Python, 然後都找不到程序源碼入口, 所以先從collider分析, 還好collider是golang寫的.

collider


collider代碼很簡單, 稍微看看就知道意思了.
collider在collider.go中開了個web服務, 支持三個路由:

func (c *Collider) Run(p int, useTls bool) {
    http.Handle("/ws", websocket.Handler(c.wsHandler))
    http.HandleFunc("/status", c.httpStatusHandler)
    http.HandleFunc("/", c.httpHandler)
    ...
  1. /ws
    這是個websocket服務, 消息是json格式, 只支持兩個命令.
    cmd = “register”命令根據roomid和clientid, 創建了room並且記住clientid.
    cm = “send”命令把收到的json中的msg發送給同一個room的別的client.
  2. /status
    返回服務器的一些狀態信息, 比如服務過了多久, 有幾個ws連接等.
  3. /
    路由爲: /roomid/clientid
    使用POST方法, post的body就是msg, 等同於上面ws命令一樣的send方法
    使用DELET方法, 刪除room和client

從上面可以看出collider創建了房間, 然後轉發客戶端send的消息給同一個房間的其他用戶.

apprtc


瞭解了collider的作用這時可以看看apprtc到底是幹什麼的.
在apprtc代碼裏搜索”/status”, 在app_engine/probers.py中找到, 順藤摸瓜找到程序入口apprtc.py

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/a/', analytics_page.AnalyticsPage),
    ('/compute/(\w+)/(\S+)/(\S+)', compute_page.ComputePage),
    ('/join/([a-zA-Z0-9-_]+)', JoinPage),
    ('/leave/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', LeavePage),
    ('/message/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)', MessagePage),
    ('/params', ParamsPage),
    ('/r/([a-zA-Z0-9-_]+)', RoomPage),
], debug=True)

原來這也是個web服務器. 使用了jinja2模板引擎.
probers.py又實現了這個路由:

app = webapp2.WSGIApplication([
    ('/probe/collider', ProbeColliderPage),
], debug=True)

這個頁面(/probe/collider)調用了collider服務器的”/status”服務, 返回已經上線的collider服務器.


從apprtc.py的Main類中可知index_template.html是首頁.
index_template.html調用了appwindow.js, 從中創建了appcontroller.js的AppController對象.
AppController是頁面的主邏輯.

call.js:創建了PeerConnectionClient

Call.prototype.createPcClient_ = function() {
  this.pcClient_ = new PeerConnectionClient(this.params_, this.startTime);
  ...
}

call.jsPeerConnectionClient真正調用WebRTC的js API.
具體的代碼不分析了.

GET ‘/params’頁面在ulr裏可以設置很多參數, 比如音視頻碼率等.具體設置方法可以參考params.html頁面的說明.


要想調用WebRTC API需要下載webrtc-adapter, 手動或者使用npm下載都可以, 參考:
https://github.com/webrtc/adapter
直接查看所有歷史版本:
https://github.com/webrtc/adapter/tree/gh-pages

綜合


apprtc是個web房間服務器, 用戶從首頁創建房間, 進入房間, 開始音視頻聊天.
核心代碼其實都在js文件中, 不想使用gae for python框架的話, 也可以自己使用別的語言編寫web服務器, 然後把html和js文件拿過來稍微改改就ok了.
collider只是實現了很簡單的幾個信令, 使用websocket通信.


WebRTC API 文檔(只翻譯了一點點中文)
一些開源資源

發佈了60 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章