janus-gateway 会话与消息/VideoRoom插件
https://github.com/meetecho/janus-gateway
janus-gateway 是啥?janus是一个基于webrtc的网关,下文我都以janus来替代janus-gateway。其中使用比较广泛的就是videoroom插件,也就是SFU 服务。与janus videoroom定位类似的开源软件有licode,kurento...
janus 传输层
janus支持多种传输协议,如http,https,ws,wss,mqtt,nanoMsg 等。客户端与janus交互的时候,可以选择其中的一种协议。后续我主要以 ws/wss来描述janus session,handle之间的关系
Transport/Session/Handle
- 可以通过ws或者wss端口与janus建立websocket链接。
- 客户端在websocket链接建立成功后,需要调用create命令创建Session
- 每个webscoket链接上可以创建多个Session
- 创建完成Session后,可以调用基于Session相关的接口,例如keepalive,claim,info、debug等相关指令.
- Handle 需要在Session上创建,每个Handle,需要绑定janus的一个插件,例如 videoroom,sipre 等插件。
- 有了Handle,就可以调用插件的通用方法,例如 videoroom插件,当创建了一个videoroom插件的handle 后,客户端就可以调用create(创建会议),exist,list等与webrtc不相干的方法。
- 每个Handle,可能会绑定一个内部的ICE Handle,从客户端的角度就是一个PeerConnection对象。绑定了ICE Handle的Handle,就可以发起媒体流相关的操作了。
- 每个Handle与ICE Handle是一一对应的。 使用完后,虽然可以释放 ICE Handle(调用hangup),重新与一个新的ICE Hanle进行绑定,但是不建议这样做,建议直接Detach Handle后,创建新的Handle
- 以videoroom 插件为例:
- 为绑定ICE handle 的Handle,可以调用create,destroy,list,exist,rtp_forward 等方法。
- 一个handle 要不成为Publisher,要不成为Subscriber,通过调用join方法实现。
消息
janus消息主要分为一下几类
- 同步请求消息
- 异步请求消息
- 事件通知消息
如果和区分同步消息和异步消息: janus里面的消息协议并没有字段来标识消息的类型,主要看一个成功时的应答客户端是收到success还是ack
同步请求消息
- 服务器成功应答时,回复success消息,如果有内容,则包含在data字段中。
- 如果失败,则返回 error消息。
- 一般非插件消息,基本都是同步消息,例如session的create,创建handle的attah
- 同步消息的应答通过transaction字段来匹配事务。客户端必须设置transaction字段的内容,服务器会在success消息返回。
异步消息
- 客户端发送一个异步消息的时候, 服务器收到以后,会先回复一个ack消息,ack中的transaction值和客户端的请求相同。
- 服务器把异步消息推送到异步队列处理。处理完成后,回复 一个 event消息,并且携带plugindata内容。插件的执行结果封装在plugindata里面。包含transaction字段,用于客户端匹配事件
- 插件如果执行失败,在plugindata.data 里面会包含error,error_code
事件消息
- 与异步消息的event类似,只不过没有transaction字段。是服务器因为其他事情而产生的消息。
client
推荐2个 golang janus 客户端api