乐趣区

WebRTC会话描述协议SDP详解

SDP 简介

SDP 全称是 Session Description Protocol,即会话描述协议,用于会话各方间的媒体协商。

  • 什么是会话?视频聊天、语音通话、视频会议等等都算会话。
  • 为什么要媒体协商?参加会话各用户环境、配置不一致,需要协商出兼容最优的解决方案。
  • SDP 长什么样子?一段多文本行,每行格式均为<type>=<value>

看一下 SDP 具体是怎样的,复制以下代码到控制台 Enter~

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('无法获取摄像头信息'));

SDP 信息详解

协议版本(v=)

v=0

SDP 的版本(Protocol version number)。当前规范版本为 0

来源(o=)

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

会话所有者有关的参数(Owner/creator and session identifier)。

  • <username> 会话发起者的名称。如果不提供则用 ”-“ 表示,用户名不能包含空格;
  • <sess-id> 主叫方的会话标识符;
  • <sess-version> 会话版本号。用 0 标识的居多;
  • <nettype> 网络类型。IN 表示 Internet 网络类型,目前仅定义该网络类型;
  • <addrtype> 地址类型。目前支持 IPV4 和 IPV6 两种地址类型;
  • <unicast-address> 会话发起者的 IP 地址。

会话名称(s=)

s=<session name>

本次会话的标题或会话的名称(Session name)。

计时(t=)

t=<start-time> <stop-time>

会话的起始时间和结束时间(Time session starts and stops)。

媒体说明(m=)

m=<media> <port>/<number of ports> <proto> <fmt> ...

媒体行,描述了发送方所支持的媒体类型等信息(Media information)。

  • <media> 媒体名称(audio/video)。表示包含音频类型或视频类型;
  • <port>/<number of ports> 流传输端口号。表示在本地端口 xxxx 上发送音频 / 视频流;
  • <proto> 流传输协议。举例说明:

    • ????RTP/SAVPF 表示用 UDP 传输 RTP 包;
    • ????TCP/RTP/SAVPF 表示用 TCP 传输 RTP 包;
    • ????UDP/TLS/RTP/SAVPF 表示用 UDP 来传输 RTP 包,并使用 TLS 加密;
    • 最后的 SAVPF 还有其他几种值:AVP, SAVP, AVPF, SAVPF。

      • AVP 意为 AV profile
      • S 意为 secure
      • F 意为 feedback
  • <fmt> 从第四位开始都是媒体格式描述。

连接数据(c=)

c=<nettype> <addrtype> <connection-address>

媒体的连接信息(Connection information)。每个媒体描述中至少包含一个 c = 字段,或者在会话描述中包含一个 c = 字段。

  • <nettype> 网络类型。IN 表示 Internet 网络类型,目前仅定义该网络类型;
  • <addrtype> 地址类型。目前支持 IPV4 和 IPV6 两种地址类型;
  • <unicast-address> 会话发起者的 IP 地址。

属性(a=)

a=<attribute> | <attribute>:<value>

属性(attribute)是扩展 SDP 的主要手段,分为 会话级 属性和 媒体级 属性:

  • 会话级属性:添加在第一个媒体描述之前,传达的信息适用于整个会议而不是单个媒体。

    • ????a=group:BUNDLE audio video 通过 mid 标识符把多个媒体属性连接起来;
    • ????a=msid-semantic: WMS ma 表示是 webrtc 媒体流(Webrtc Media Streams);
  • 媒体级属性:媒体描述中添加有关媒体流的信息。

    • ????a=mid:audio 上述 BUNDLE 中用到的媒体标识;
    • ????a=msid:ma ta 连接不同的媒体描述,使用相同的 MediaStreams;
    • ????a=sendonly 表示媒体发送端,其他类型:recvonly,sendrecv,inactive;
    • ????a=rtcp:9 IN IP4 0.0.0.0 用来传输 rtcp 地地址和端口;
    • ????a=rtcp-mux 表示 rtp,rtcp 包使用同一个端口来传输;
    • ????a=ice-xxx:xxx ice 协商过程中的安全验证信息;
    • ????a=fingerprint:xxx 表示 dtls 协商过程中需要的认证信息;
    • ????a=setup:actpass 表示本客户端在 dtls 协商过程中,可以做客户端也可以做服务端;
    • ????a=rtpmap:111 opus/48000/2 负载类型 111,编码格式 opus,48000 是时钟,2 是通道数;
    • ????a=rtcp-fb:111 nack 支持丢包重传;
    • ????a=rtcp-fb:111 nack pli 支持关键帧丢包重传;
    • ????a=rtcp-fb:111 transport-cc 表示 opus 编码支持使用 rtcp 来控制拥塞;
    • ????a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=16000 对 opus 编码可选的补充说明,minptime 代表最小打包时长是 10ms,useinbandfec= 1 代表使用 opus 编码内置 fec 特性;
    • ????a=ssrc:1370113029 cname:NMediaAudio cname 用来标识一个数据源,ssrc 当发生冲突时可能会发生变化,但是 cname 不会发生变化,也会出现在 rtcp 包中 SDEC 中,用于音视频同步;
    • ????a=candidate:1 1 udp 2013266431 x.x.x.x 43342 typ host generation 0 表示候选人的传输地址,查看详情。

参考

  • https://tools.ietf.org/html/rfc4566
  • https://blog.piasy.com/2018/10/14/WebRTC-API-Overview/index.html
  • https://blog.csdn.net/dzxs_gb28181/article/details/80951094
  • https://blog.csdn.net/chinabinlang/article/details/79151589
退出移动版