这篇文章上次修改于 902 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输,支持网页浏览器进行实时语音对话或视频对话。
参考 https://github.com/bovinphang/WebRTC
1 WebRTC API
为了获取和传送流数据,WebRTC 应用需要实现以下 API:
- MediaStream: 通过 MediaStream 的 API 能够通过设备的摄像头及话筒获得视频、音频的同步流
RTCPeerConnection:用来在浏览器之前高效的处理固定数据流的通道。该通道是点对点的,无需服务器中转。
但在真实的应用场景中,往往需要服务器的配合才能完成数据交互,因此还需要如下几种服务器:- 用户发现以及通信
- Signaling:信令传输,信令包括:
会话控制消息用于打开或关闭通信
错误消息
媒体元数据,如编解码器和编解码器设置,带宽和媒体类型
密钥数据,用于建立安全的连接
网络数据,如:外界看到的主机 IP 地址和端口 - STUN:NAT/防火墙穿透
- TRUN:如果点对点通信建立失败,可以作为中转服务器
ICE(Interactive Connectivity Establishment) 框架中整合了 STUN 和 TRUN 等服务
参考 http://www.aman.site/tags/#WebRTC
2 RTCPeerConnection 初始化
- 确定本地媒体条件,如分辨率和编解码器功能,这是用于 offer 和 answer 机制的元数据。需要通 Signaling 服务器透传 SDP 信息。SDP 会话描述协议用于描述连接的多媒体内容(如分辨率,格式,编解码器,加密等)。
- 获取应用程序主机的潜在网络地址,成为候选人(candidates)
3 多方通信 WebRTC 架构
- Mesh:多个终端两两连接
- MCU:由一个服务器和多个终端组成。各个终端将要共享的音视频流发送给服务器,服务器转发给各个终端。服务端需要将所有终端的音视频进行混合。
- SFU:由一个服务器和多个终端组成。各个终端将要共享的音视频流发送给服务器,服务器转发给各个终端。服务端不用将所有终端的音视频进行混合。
参考 https://blog.csdn.net/weixin_40592935/article/details/104779851
4 Janus
WebRTC Server,主要由三部分组成:
- Core:处理数据流的转发和各种协议的接入,包含了 ICE、SDP、RDP 等。
- Plugin:实现了一般性的需求供客户端使用。
- Transport:信令传输层,支持的协议包括 HTTP、Websocket 等。
详见 https://www.jianshu.com/p/78f2689158dd
使用 Janus 的 Plugin 提供的 API 进行通信:
- 创建 Janus 客户端,需要填写 Signaling 服务器地址。
调用客户端的 attach() 到 plugin 上。回调函数:
- success() 可获取控制 stream 的 handler,比如可对 stream 进行 detach;
- onmessage() 用来交换 SDP 信息;
- onremotestream() 用来获取 stream,进而获得 stream 的跟踪信息,如 stream.getVideoTracks() 等。
没有评论