天天看點

Chrome 57版本的WebRTC預設使用rtp,rtcp端口複用

流媒體傳輸協定(RTP)包括兩個不同的元件: 1,RTP負責傳輸音視訊資料。 2,RTCP負責傳輸控制信令。 RTP協定 規範 規定,“  底層協定必須提供資料和控制資料包的複用,例如使用單獨的UDP端口号  ”。 由于使用兩個不同的端口(主要是由于NAT穿越)導緻的複雜性, RFC-5761  提供了“使用單獨的UDP端口解複用RTP和RTCP的替代方法,而僅使用單個UDP端口并在應用程式内解複用”。

WebRTC媒體協商 基于會話描述協定( SDP ),遵循offer / answer模型。為了表示自己支援rtp,rtcp複用端口,需要在sdp中加入a=rtcp-mux,下面是chrome浏覽器産生的sdp片段 [...]a=rtcp:9 IN IP4 0.0.0.0a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-levela=sendrecv a=rtcp-mux a=rtpmap:111 opus/48000/2a=rtcp-fb:111 transport-cca=fmtp:111 minptime=10;useinbandfec=1a=rtpmap:106 CN/32000a=rtpmap:105 CN/16000a=rtpmap:13 CN/8000a=rtpmap:110 telephone-event/48000a=rtpmap:112 telephone-event/32000a=rtpmap:113 telephone-event/16000a=rtpmap:126 telephone-event/8000a=candidate:3455144793 1 udp 1685987071 95.23.241.104 62622 typ srflx raddr 192.168.1.131 rport 62622 generation 0 ufrag 9Che network-id 1 network-cost 10[...] 在上面的例子中,紅色标記a=rtcp-mux說明支援RTCP複用。

以同樣的方式,Answer SDP如果要接受RTCP端口複用也應該包括 a=rtcp-mux : [...]c=IN IP4 91.220.9.62t=0 0m=audio 25384 UDP/TLS/RTP/SAVPF 111 110 106a=rtpmap:111 opus/48000/2a=fmtp:111 useinbandfec=1; minptime=10a=rtpmap:110 telephone-event/8000a=rtpmap:106 CN/8000a=ptime:20 a=rtcp-mux a=rtcp:25384 IN IP4 91.220.9.62a=candidate:9711301045 1 udp 659136 91.220.9.62 25384 typ host generation 0

WebRTC為什麼要RTCP端口複用呢?WebRTC NAT穿越是 基于 ICE 的,ICE收集候選人時:

  • 如果RTP和RTCP在不同的端口上發送,那麼兩個元件都需要進行連接配接檢查。
  • 如果RTP和RTCP在同一個端口上複用,則隻需要進行一次連接配接檢查。

RTCP端口複用降低了ICE開銷,因為它隻需要收集更少的的ice candicate,并且減少了流媒體架構中的其他部分的開銷,例如TURN伺服器中使用的UDP端口較少,連接配接檢查浪費的帶寬較少。

PeerConnection 構造函數允許應用程式為媒體會話指定全局參數。其中, 應用程式可以 使用以下政策之一 指定 使用RTP / RTCP複用的首選政策 :

  • negotiate:包括a=rtcp-muxSDP中的屬性,同時收集RTP和RTCP的候選。
  • require:包括a=rtcp-muxSDP中的屬性,僅收集RTP候選。這減少了提供者需要聚集的候選人的一半。

Chrome57以前,chrome和firefox預設政策一直是 negotiate ,但是從 Chrome M57 開始, rtcpMuxPolicy 設定已經從 negotiate變為require 。如果您對在開發一對一的WebRTC程式,這不會有什麼影響,因為浏覽器應能夠協商RTP / RTCP複用功能。但是如果您正在使用WebRTC 伺服器轉發音視訊,它可能會引起相容性問題,你要確定你的伺服器支援RTCP端口複用。在Chrome57版本中你還可以強制把rtcpMuxPolicy設定為 negotiate ,但是到了Chrome58版本,rtcpMuxPolicy屬性将要被棄用,也就是說Chrome58版本之後,rtp,rtcp資料隻能在同一個端口傳輸了

繼續閱讀