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)
...
- /ws
這是個websocket服務, 消息是json格式, 只支持兩個命令.
cmd = “register”命令根據roomid和clientid, 創建了room並且記住clientid.
cm = “send”命令把收到的json中的msg發送給同一個room的別的client. - /status
返回服務器的一些狀態信息, 比如服務過了多久, 有幾個ws連接等. - /
路由爲: /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.js和PeerConnectionClient真正調用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通信.