搜索
您的当前位置:首页正文

WebRTC的apprtc和collider源码分析

来源:二三娱乐

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+)', 
    ('/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页面的说明.


综合


apprtc是个web房间服务器, 用户从首页创建房间, 进入房间, 开始音视频聊天.
核心代码其实都在js文件中, 不想使用gae for python框架的话, 也可以自己使用别的语言编写web服务器, 然后把html和js文件拿过来稍微改改就ok了.
collider只是实现了很简单的几个信令, 使用websocket通信.


Top