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