1、sdp介紹
SDP(Session Description Protocol)是一種用于描述多媒體會話的協議,它在會話層起著重要的作用。SDP的主要功能是提供會話的元數據和配置信息,以便參與者能夠協商和建立一致的會話。
以下是SDP在會話層的作用:
-
會話描述:SDP提供關于會話的描述,包括會話的起始時間、結束時間、會話名稱、會話發起者等。這些信息幫助參與者了解會話的基本屬性。
-
媒體描述:SDP包含了關于會話中每個媒體流的描述,例如音頻、視頻、數據等。媒體描述包括媒體類型、傳輸協議、編解碼器信息、網絡地址等。通過這些描述,參與者可以了解如何傳輸和處理會話中的不同媒體數據。
-
媒體協商:SDP允許參與者在會話建立過程中進行媒體協商。通過SDP,參與者可以提供自己支持的媒體編解碼器、傳輸協議和其他參數。參與者可以交換SDP消息以協商媒體流的編碼格式、傳輸選項和其他相關設置,從而達成一致的媒體配置
2、sdp Offer
v=0
o=- 4849970681842256719 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS eb733957-3cc6-4765-b18f-e0ed14f25327m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:5ntO
a=ice-pwd:G2W0QvXRMnpYrWhn1aVqJPkh
a=ice-options:trickle
a=fingerprint:sha-256 4D:0C:B5:4C:7E:1E:04:B3:1A:ED:67:B5:F4:B1:D0:00:12:C9:C9:4C:7A:92:63:D4:CE:39:82:94:2C:97:4C:7A
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:eb733957-3cc6-4765-b18f-e0ed14f25327 03522f49-55e7-47c1-b260-059b0210459c
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:1267016006 cname:jJhO4vLtJlw1ziFr
a=ssrc:1267016006 msid:eb733957-3cc6-4765-b18f-e0ed14f25327 03522f49-55e7-47c1-b260-059b0210459cm=video 9 UDP/TLS/RTP/SAVPF 96 97 102 103 104 105 106 107 108 109 127 125 39 40 45 46 98 99 100 101 112 113 116 117 118
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:5ntO
a=ice-pwd:G2W0QvXRMnpYrWhn1aVqJPkh
a=ice-options:trickle
a=fingerprint:sha-256 4D:0C:B5:4C:7E:1E:04:B3:1A:ED:67:B5:F4:B1:D0:00:12:C9:C9:4C:7A:92:63:D4:CE:39:82:94:2C:97:4C:7A
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:eb733957-3cc6-4765-b18f-e0ed14f25327 6306e127-1df4-4d8e-b6c2-d860a5dedd74
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:103 rtx/90000
a=fmtp:103 apt=102
a=rtpmap:104 H264/90000
a=rtcp-fb:104 goog-remb
a=rtcp-fb:104 transport-cc
a=rtcp-fb:104 ccm fir
a=rtcp-fb:104 nack
a=rtcp-fb:104 nack pli
a=fmtp:104 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:105 rtx/90000
a=fmtp:105 apt=104
a=rtpmap:106 H264/90000
a=rtcp-fb:106 goog-remb
a=rtcp-fb:106 transport-cc
a=rtcp-fb:106 ccm fir
a=rtcp-fb:106 nack
a=rtcp-fb:106 nack pli
a=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=106
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:125 rtx/90000
a=fmtp:125 apt=127
a=rtpmap:39 H264/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=fmtp:39 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:45 AV1/90000
a=rtcp-fb:45 goog-remb
a=rtcp-fb:45 transport-cc
a=rtcp-fb:45 ccm fir
a=rtcp-fb:45 nack
a=rtcp-fb:45 nack pli
a=rtpmap:46 rtx/90000
a=fmtp:46 apt=45
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:112 H264/90000
a=rtcp-fb:112 goog-remb
a=rtcp-fb:112 transport-cc
a=rtcp-fb:112 ccm fir
a=rtcp-fb:112 nack
a=rtcp-fb:112 nack pli
a=fmtp:112 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:113 rtx/90000
a=fmtp:113 apt=112
a=rtpmap:116 red/90000
a=rtpmap:117 rtx/90000
a=fmtp:117 apt=116
a=rtpmap:118 ulpfec/90000
a=ssrc-group:FID 130771272 388261291
a=ssrc:130771272 cname:jJhO4vLtJlw1ziFr
a=ssrc:130771272 msid:eb733957-3cc6-4765-b18f-e0ed14f25327 6306e127-1df4-4d8e-b6c2-d860a5dedd74
a=ssrc:388261291 cname:jJhO4vLtJlw1ziFr
a=ssrc:388261291 msid:eb733957-3cc6-4765-b18f-e0ed14f25327 6306e127-1df4-4d8e-b6c2-d860a5dedd74
會話描述
o=- 4849970681842256719 2 IN IP4 127.0.0.1?
媒體描述
m=audio:音頻媒體流的負載類型在a=rtpmap行中定義。例如,a=rtpmap:111 opus/48000/2表示負載類型111對應于opus編解碼器。
m=video:視頻媒體流的負載類型同樣在a=rtpmap行中定義。例如,a=rtpmap:96 VP8/90000表示負載類型96對應于VP8編解碼器。
3、在提供的SDP中,負載類型102和104都對應于H.264編解碼器,
? 參數配置(fmtp):不同
? ?- 對于負載類型102:`a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f`
? ?- 對于負載類型104:`a=fmtp:104 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f`
? ?注意到這兩個負載類型在`packetization-mode`參數上有所不同。對于負載類型102,設置為1,而對于負載類型104,設置為0。這表示在負載類型102中使用了分片(packetization),而負載類型104中沒有使用分片。
?RTCP反饋(rtcp-fb):是相同的
? ?- 負載類型102的RTCP反饋:`a=rtcp-fb:102 goog-remb`, `a=rtcp-fb:102 transport-cc`, `a=rtcp-fb:102 ccm fir`, `a=rtcp-fb:102 nack`, `a=rtcp-fb:102 nack pli`
? ?- 負載類型104的RTCP反饋:`a=rtcp-fb:104 goog-remb`, `a=rtcp-fb:104 transport-cc`, `a=rtcp-fb:104 ccm fir`, `a=rtcp-fb:104 nack`, `a=rtcp-fb:104 nack pli`
? ?這些RTCP反饋配置是為了支持不同的功能,如擁塞控制(REMB、Transport-CC)、請求關鍵幀(CCM FIR)、重傳(NACK)和重要幀指示(NACK PLI)。這些反饋可能在負載類型102和104之間的具體實現或優先級上有所不同。
4、負載類型102和104之間的分片模式(packetization mode)的差異會對視頻傳輸產生具體的影響。
負載類型102中的分片模式設置為1(packetization-mode=1),表示使用分片模式。這意味著H.264視頻幀在傳輸時將被分割成更小的數據包(也稱為分片)進行傳輸。這種分片模式通常被稱為"Single NAL Unit Mode",即每個RTP包中僅包含一個NAL單元。
相比之下,負載類型104中的分片模式設置為0(packetization-mode=0),表示不使用分片模式。這意味著H.264視頻幀將作為完整的NAL單元進行傳輸,而不進行分割。
具體影響如下:
1. 延遲:使用分片模式(負載類型102)可以將視頻幀拆分為較小的數據包,這可能有助于降低傳輸延遲。較小的數據包可以更快地傳輸和處理,從而減少端到端的延遲。
1. 丟包恢復:在負載類型102中使用分片模式,即每個RTP包僅包含一個NAL單元,如果發生丟包,只丟失單個NAL單元而不會影響整個視頻幀。這使得丟失的單元可以更容易地通過重傳(NACK)或其他恢復機制進行補償。
1. 壓縮效率:分片模式(負載類型102)會增加一些額外的開銷,因為每個RTP包都需要包含NAL單元的頭部和額外的RTP頭部。相比之下,非分片模式(負載類型104)將整個NAL單元作為一個單一的數據包進行傳輸,從而減少了一些額外的開銷。
需要注意的是,分片模式的選擇可能根據網絡條件、傳輸需求和設備兼容性等因素進行調整。因此,在實際應用中,選擇合適的分片模式可以根據具體情況進行評估和調整。
5、rtcp-fb為什么有這么多個
在SDP中,"rtcp-fb"(RTCP Feedback)用于定義RTCP的反饋機制,以支持各種功能,如擁塞控制、容錯機制和質量反饋等。每個"rtcp-fb"參數對應一個特定的功能或反饋類型。
在提供的SDP中,有多個"rtcp-fb"參數是因為不同的視頻編解碼器和傳輸配置可能需要不同的RTCP反饋機制。每個"rtcp-fb"參數都指定了相應的負載類型(payload type),以及支持的具體反饋類型。
例如,"rtcp-fb:96 goog-remb"指定了負載類型96(對應VP8編解碼器),并啟用了Google的擁塞控制反饋(REMB)。"rtcp-fb:102 transport-cc"指定了負載類型102(對應H.264編解碼器),并啟用了傳輸層擁塞控制(Transport-CC)。其他的"rtcp-fb"參數也類似地指定了不同的編解碼器和反饋類型的組合。
這些"rtcp-fb"參數的存在是為了滿足不同編解碼器和傳輸需求的靈活性和互操作性。具體使用哪些"rtcp-fb"參數取決于通信雙方的支持和協商
?