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 文档(只翻译了一点点中文)
一些开源资源

推荐阅读更多精彩内容