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通信.
附
WebRTC API 文档(只翻译了一点点中文)
一些开源资源