天天看点

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数据只能在同一个端口传输了

继续阅读