Fork me on GitHub

webRTC使用记录5

副标题:webRTC使用记录之 媒体协商SDP及媒体服务器

SDP

媒体协商

  1. Amy 创建 offer,告知待协商信息同时存入本地的 setLocalDescription。
  2. offer 经由信令服务器抵达 Bob。
  3. Bob 提取 offer,存入本地的setRemoteDescription。
  4. Bob 自己做判断,将协商结果发起Answer,同时存入本地的 setLocalDescription。
  5. Answer 经由信令服务器抵达 Amy。
  6. Amy提取 Answer,存入本地的 setRemoteDescription。同时 Amy 依据协商结果,对格式等信息进行一些调整。

待协商信息一般是SDP,也可以是其他。


SDP 协议

SDP 协议,属于一种文本规范。

  1. 多个媒体级描述
    1. 媒体格式
    2. 传输协议
    3. 传输 ip 和 port
    4. 媒体负载类型
  2. 一个会话级描述
    1. 会话名称、目的
    2. 会话存活时间
    3. 包含多个媒体信息
  3. 由多个 type = value 组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# SDP 范例 s session/o owner/m media /c connect/a attribute/ rtpmap
// 必选
s = <session name>
o = <username><session id><version><network type><address type><address>
//如: o = - 70176543125 2 IN IP4 127.0.0.1
m = <media><port><transport><fmt/payload type list> // 关键
//如:m = audio 1024 UDP/TLS/RTP/SAVPF 111 102 104 9 0 8 106 105 13 126


// 可选
c = <network type><address type><connection address>
//如:c = IN IP4 0.0.0.0
a = <Type>
//如:a = framerate
a=rtpmap:<fmt payload type><encoding name>/<clock rate>[/<encodingparameters]
//如:a = rtpmap:103 ISAC/16000
a=fmtp:<format/payload type> parameters
//如:a = fmtp:13 apt=106

WebRTC 中的 SDP

与上文 SDP 有所区别。webRTC的 SDP 组成:

  1. 会话元
  2. 网络描述
  3. 流描述
  4. 安全描述
  5. 服务质量

参考链接:WebRTC会话描述协议(SDP)详解

1
2
// 复制以下代码到 chrome 的 console 即可拿到 SDP 数据
const PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; const peer = new PeerConnection(); navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(stream => { stream.getTracks().forEach(track => { peer.addTrack(track, stream); }); peer.createOffer().then(e => { console.log(e.sdp); }) }) .catch(e => alert('无法获取摄像头信息'));

主流媒体服务器

多人音视频架构

  1. Mesh 方案:建立多个 p2p 通信,难以商用。
  2. MCU 方案:中心服务器,硬件实现架构,价格昂贵。
  3. SFU 方案:主要进行网络流的转发,传输量大,可能丢包。 主流方案

1 对 1 方案:

SFU 方案:

tips:

  1. SFU 不进行音视频的编解码,直接转发
  2. webRTC 使用signaling(空耳) 或者 SVC 的方式,应对传输带宽的难题,比如先传核心层(较模糊的音视频),等带宽足够了,再传细节层(粗粗的理解)。

Mediasoup 方案:

其中 Nodejs 部分可以用其他方案替代:Tomcat、jetty、nginx 都行。

  1. 提供 www 服务、提供客户端代码
  2. 提供信令服务,执行 SDP 消息传递、room 的创建及销毁等
-------------The End-------------