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 表示候選人的傳輸地址,查看詳情

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章