超低延时直播(RTM,Real Time Media)功能基于音视频处理技术和大规模内容分发技术,通过链路传输协议改造为 UDP 等底层技术优化,解决 TCP 协议自身局限和网络抖动引起延迟累加,除了配合火山引擎专用播放端 SDK 外,您可以使用浏览器 WebRTC 信令交互方式从直播节点推拉音视频流,实现千万级并发场景下的毫秒级延时视频直播。
本文将为您介绍 WebRTC 标准接入 SDP 信令协议的规范和流程。
具有 WebRTC 基础的开发人员
客户端 | 支持版本 |
---|---|
Chrome | 96 及以上版本 |
Safari | 15.1 及以上版本 |
Edge | 96 及以上版本 |
Firefox(拉流) | 101 及以上版本 |
微信浏览器 | 8.0.16 及以上版本 |
本节为您介绍 HTTP SDP 信令交互的流程。
客户端发送 SDP 信令请求
服务端接口返回 SDP Answer 响应,信令接口格式请参见信令接口定义;
建立 STUN 与 ICE 连接
服务端发送媒体数据至客户端。
请求示例如下所示。
{"version":"1.0","sessionId":"testId","localSdp":{"type":"offer","sdp":"<offer text>"}}
请求参数说明如下表所示。
参数 | 类型 | 是否必传 | 说明 |
---|---|---|---|
version | String | 是 | "版本号,取值为 1.0" |
sessionId | String | 否 | 客户端生成的唯一 ID,用于标识一次会话 |
localSdp | Struct | 是 | 请求 SDP 信息 |
type | String | 是 | SDP 的信令类型,发起请求时取值为 offer |
sdp | String | 是 | SDP 文本 |
响应示例如下所示。
{"code":200,"message":"success","remoteSdp":{"type":"answer", "sdp":"<answer text>"}
响应参数说明如下表所示。
参数 | 类型 | 是否必传 | 说明 |
---|---|---|---|
code | Int | 是 | 状态码,详情请参见 code 码表 |
message | String | 是 | 状态信息 |
remoteSdp | Struct | 是 | 响应 SDP 信息 |
type | String | 是 | SDP 的信令类型,响应请求时取值为 answer |
sdp | String | 是 | SDP 文本 |
code | 定义 |
---|---|
200 | 成功 |
100 | URL 错误 |
101 | JSON 参数不合法 |
401 | 流信息错误 |
403 | 鉴权失败 |
404 | 流不存在 |
601 | 内部错误。需要客户端强制降级,切到 RTMP、HTTP-FLV 或 HLS 协议 |
说明
音视频方向性需要设置为 SendOnly 或者 RecvOnly。
offerToReceiveAudio
和 offerToReceiveVideo
同时为 0;offerToReceiveAudio
和 offerToReceiveVideo
同时为 1。// 获取音视频源 const constraints = { audio: { optional: [{ sourceId: audioSource }] }, video: { optional: [{ sourceId: videoSource }] } }; const userMediaStream = await navigator.mediaDevices.getUserMedia(constraints); // 创建 PeerConnection,并设置对音视频方向性的控制 pc = new RTCPeerConnection({ offerToReceiveAudio: 0, offerToReceiveVideo: 0 });
userMediaStream.getTracks() .forEach(track => pc.addTrack(track, userMediaStream));
const offer = await pc.createOffer({ offerToReceiveAudio: 0, offerToReceiveVideo: 0 }); pc.setLocalDescription(offer); let data = { version: "1.0", sessionId: "******", localSdp: offer }; fetch(rtmURLInput.value, { method: "POST", mode: "cors", headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) }) .then(response => response.json()) .then(response => { const answer = { type: 'answer', sdp: response.remoteSdp }; })
pc.setRemoteDescription(answer);
您可以使用转码功能来删除视频 B 帧并修改音频编码格式为 Opus。