本文以 Web 平台为例,介绍如何在项目中,实现音视频发布流和订阅流功能。
- 搭载 Intel 第二代酷睿处理器或更佳性能的处理器;
- 有可用的物理音视频采集设备,如内置摄像头和麦克风;
- 安装最新版本的 Chrome 浏览器,并设置为默认浏览器;
一次简单的音视频通话的流程图如下:
实现一次简单的音视频通话主要包含以下步骤:
调用浏览器原生 getUserMedia 创建一个本地音视频流,并保存音视频轨道。
2. 发布端:创建 PeerConnection,添加 transceiver,设置 offer
3. 订阅端:创建 PeerConnection,添加 transceiver,设置 offer
4. 发布端和订阅端:与 veWTN 服务器通信,交换 offer
发布订阅的双方交换 SDP 之后,peerConnection 就已经成功建联。此时订阅端 peerConnection 可在回调 ontrack 中接收到发布端的音视频流。
6. 发布端和订阅端:断开 PeerConnection
断开 PeerConnection 后,音视频流的发布和接收也将停止。
至此,我们实现了基础的音视频通话。
1. 发布订阅的双方交换 SDP 之后,订阅端 peerConnection 无法在 ontrack 中监听到发布端的音视频流?
如遇此情况,请在实现功能时先执行步骤 5 订阅和播放音视频流,再执行步骤 4 与 veWTN 服务器通信,交换 offer。
2. 是否支持 DataChannel?如何使用?
支持。我们提供了复用媒体通道的超低延时信令通道 DataChannel,用于在多端之间实时同步自定义数据,如控制信令、鼠标操作、消息通知等。
创建 RTCPeerConnection 后,调用相应的 API。每个 RTCPeerConnection 实例 仅支持创建一个 DataChannel。
消息的发送方向取决于当前 PeerConnection 的角色以及你是否在消息中指定了目标流。
- 你可以通过一个特殊格式的消息头,精确控制消息要发送给哪些流的对端。格式如下:
- {"stream_ids":[...]}:一个 JSON 对象,stream_ids 数组中包含了一个或多个目标流的 ID。
- your_actual_data:你实际要发送的业务数据。
- 当直接调用 channel.send(data) 发送消息时,将遵循以下默认规则:
- 若该连接上有 发布流,则该消息将被广播给所有 订阅了这些流 的接收端。
- 若该连接上 没有发布流(即纯订阅端),则该消息将被发送给所有 它所订阅的流 的发布端。
- 场景1:一对多广播 (1 位发布者 vs. 多位订阅者)
- A发布 stream_A 并订阅 stream_B;B发布 stream_B 并订阅 stream_A。
- 因此,A 是发布者也是订阅者,B 是发布者,C 和 D 是纯订阅者