【译】A Unified Plan for Using SDP with Large Numbers of Media Flows
1. 简介
2. 解决方案概览
high level,该方案可以总结如下:
1.每个media stream track由它自己的m-line表示。严格的一一映射,一个media stream track不可表示为多个mline,一个mline也不可以表示多个media stream track。注意这会使得当前定义simulcast的方式(https://tools.ietf.org/html/draft-westerlund-avtcore-rtp-simulcast-04 )有所改变。这不排除“应用级别”的simulcast,也就是从单个源创建多个media stream track。
-
每个mline有个”a=ssrc“属性关联到它的RTP包。如果没有其他的信令扩展,mline的多个ssrc被认为是同一个media stream track的可选的source:尽管发送方可以按需在ssrc之间切换,但是同一时刻只有一个ssrc在发送
-
每个mline有一个msid关联media stream id和media stream track id
-
为了最小化端口分配,依赖于BUNDLE机制(I-D.ietf-mmusic-sdp-bundle-negotiation)
-
为了减少呼叫建立期间的端口分配,应用可以用这种方式标记不关键的media stream track使得它不需要分配端口,就是这些属性只在BUNDLE机制下起作用
-
可以offer/answer部分交换。这些交换每次操作一个mline,而不是整个sdp body。这种方式可以完全避免关注stream的增删,减少对活跃stream改变的关注。这要求所有mline包含一个mid属性。
-
一个bundle中的所有source必须包含完全相同的属性值,除了直接应用于media stream track的属性(比如lable, msid, resolution)。细节请参考(https://tools.ietf.org/html/draft-nandakumar-mmusic-sdp-mux-attributes-02 )
标记为IDENTICAL的属性 -
RTP和RTCP流严格基于他们的SSRC解复用。然而,为了处理遗留case和signaling/media race,stream和mline的相关关系可以使用其他的机制,
3. 详细描述
3.1 Bundle-only M-lines
3.2 相关关系
该机制有三个相关关系,需要mline, media stream track和RTP source相互关联。
3.2.1 RTP source关联到mline
通过5元组发送多个媒体流对流的区分和关联造成挑战。本提案保持使用ssrc作为5元组之间传输多流的解复用的方式。
顾名思义,这种相关性是通过SDP中的a=ssrc属性实现。理想情况下,SDP交换中使用a=ssrc属性足够关联流和mline。但是,至少有三种无关的情形使用其他机制会更有优势。
呼叫建立期间,可能出现一端为了新流发送offer,收到媒体流早与包含相关ssrc的SDP。这种情况,该端不知道如何处理媒体而会被强制丢弃媒体数据。这会导致媒体clipping,对用户体验有很强的影响。对于音频流,回答方的hello会丢失,对于视频流,初始的I-帧会丢失,导致直到下一个I帧之前的其他帧都丢失或者损坏。
在少数情况下,需要改变一个已经存在的source的SSRC,然后任意一方改变了它的SSRC需要通知远端更新映射关系,比如通过一个新的SDP offer。既然直到新的offer/answer交换发生之前的媒体数据都不能渲染,clipping的问题又会出现。
跟遗留设备交互的时候可能会有不同的问题。许多情形会导致遗留设备不能包含SSRC信息到SDP中。例如,一个系统把信令和媒体分解到不同的网络设备,频繁通信的协议不会包含SSRC信息,也不可能包含在SDP中。如果这些设备选择实现bundling,把媒体流关联到mline需要其他的关联方式。
这些场景和其他类似的场景,可以通过媒体流自己的信息作为关联方式来改善。如果收到带有未关联mline的ssrc的数据包,有几种方式在收到answer之前进行关联。
作者强调本技术只用于把解复用后的stream关联到mline。同一个传输地址的多流解复用继续使用SSRC值。我们期待并且所有其他的BUNDLE扩展的使用者应该利用它。
3.2.1.1 通过RTP头部扩展关联
这种关联的首选机制是新的RTP header扩展(RFC5285),可以用于RTP流开始时SSRC映射信息不可得的时候。我们提议WebRTC必须实现这种机制。
尽管交互能力要求额外的规范,这种相关性的框架描述如下。
利用本机制的实现,会在希望利用本机制的mline中包含a=extmap属性来实现local correlation。这个属性包含从RTP header ID到URL的映射,和16bit的ID;这样的mline看起来是这样的:
m=audio 55400 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 7582 // NEW
a=mid:1
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=ssrc:35987
a=candidate:0 1 UDP 2113667327 203.0.113.2 55400 typ host
如果远端支持这个扩展,必须在RTP流的前几个(通常是3到10个)包中包含RTP头部扩展。头部扩展的值通过extmap行实现相关性(上面例子中的7582)
3.2.1.2 通过Payload类型关联
为了支持不能实现上一节描述的RTP header扩展的实现,但是想利用BUNDLE机制,我们允许使用payload type关联作为可选方法(不优先推荐)。该方法利用offer包含它创建者选择的payload type,这会出现在远端收到的任意的RTP包中。如果这些payload type是唯一的,可以很可靠地把到来的RTP流关联到mline。
由于payload type的固有限制,建议如果有可能就使用其他的关联技术而不是PT(payload type)多路复用。对于WebRTC,我们提议用传递给createoffer的额外限制控制这个技术的使用。
如果该限制(译者注,createoffer时的参数,用来表示pt会用于解复用)已经设置,浏览器必须表现如本节描述一样。如果限制没有设置,在每个mline bundle中为同样的codec使用完全相同的PT(payload type)。
当这样的限制出现时,本规范的实现在重用pt之前尝试穷举数字空间中的所有动态的PT。如果出现该限制同时pt空间用尽,可以采取如下动作:
- 为了保持{payload type, transport address}唯一,bind到多个本地传输地址(使用不同的BUNDLE group)
- 向应用通知失败
开放问题:翻译略
注意前文提到的flag的出现与否不影响到来的流怎样被关联:如果correlation RTP header extension出现,它优先于payloadtype被使用。相反,如果该flag缺失,并且RTP不包含这样的header,pt可以被用来对应mline。当然,如果流需要知道相关性之前已经可以获得SDP中的ssrc信息,那么ssrc可以用于此目的。
3.2.2 media stream track 关联到mline
media stream track ID通过每个mline中的MSID直接关联到mline。MSID还提供了media stream ID。(注意这里使用的MSID的格式稍微不同于现行MSID草案中的提议,那个草案假设一个mline有多个track,本提案假设Track和MSID是一对一关系。这项工作假设MSID草案会被更新。
3.2.3 media stream track关联到RTP source
media stream track通过
RTP-Source <=> M-Line <=> Media-Stream-Track
关系传递关联到RTP source。
3.3 处理Simulcast, FEC和重传stream
Simulcast指单次捕获,多次编码得到不同的分辨率或帧率。例如,一个带有高清摄像头的设备可以发送一个全高清版本和一个低分辨率版本。这可以使视频会议bridge能够不用重新编码发送不同分辨率到不同的目的地。
FEC和RTX stream可以提高遇到丢包时的鲁棒性。这些方法通常使用与他们应用的原stream不同的PT和SSRC。
如果一个media source需要对应到不知一个RTP flow,例如RTX FEC或者simulcast,a=ssrc-group概念用来为一个media stream track创建SSRC组。这里每个SSRC用a=ssrc属性声明,他们共用相同的MSID,a=ssrc-group定义了分组的SSRC的行为。
这些组划分用于到来的RTP stream的解复用,用SSRC把他们关联到他们的primary flow。RTX和FEC的多路复用已经定义好;RTX SSRC多路复用行为在RFC4588中定义。FEC SSRC多路复用行为在RFC596中定义。
注意RTX和FEC也包括使用了不同mline的SDP表示方法。这些格式为了stream的相关性是基于传输地址的,不适用与bundle的stream。我们的特别提案是:(1)bundling实现永远不生成这种格式。并且(2)bundling实现可以接收这种格式的SDP或者可以直接拒绝repair stream按照不支持repair format处理。
对于多分辨率的simulcast,我们创建相似的ssrc-group,为a=ssrc行调整imageatta属性(定义在rfc6236)来表明发送的分辨率。在下面的例子中,SDP表示了单摄像头源两种分辨率有还一个支持RTX的屏幕共享源,a=ssrc-group用来关联单个媒体源的不同ssrc。
注意本方法的一个特性是不允许在fmtp之外独立设置simulcast,FEC和RTX流的属性。特别地,诸如ptime和framerate属性在simulcast分组的流之间共享。
m=video 62537 RTP/SAVPF 96 // main video
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 15955
a=mid:1
a=rtpmap:96 VP8/90000
a=sendrecv
a=rtcp-mux
a=ssrc:29154 imageattr:96 [x=1280,y=720]
a=ssrc:47182 imageattr:96 [x=640,y=360]
a=ssrc-group:SIMULCAST 29154 47182
m=video 0 RTP/SAVPF 96 97 // slide video
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 26267
a=mid:2
a=rtpmap:96 VP8/90000
a=rtpmap:97 rtx/90000
a=sendrecv
a=rtcp-mux
a=fmtp:97 apt=96;rtx-time=3000
a=ssrc:45982
a=ssrc:9827
a=ssrc-group:FID 45982 9827 // FID provides SSRC correlation
a=bundle-only
为SIMULCAST grouping基于每个SSRC提供显式的分辨率,可以让中间人(例如Media Translator)能够不检查媒体流就选择合适的SIMULCAST layer,否则需要解密和部分解码媒体数据包。
3.4 glare minimization
为了承诺的glareless的新增和删除流,和减少stream属性改变的glare。我们提议允许mline互相独立改变的技术。提议使用“部分offer”和“部分answer”。使用该技术有两个关键前提:(1)会话中的所有offer/answer交换的每个mline都包含a=mid属性。(2)两边都支持部分offer/answer技术(要么因为他们是单个控制域的一部分,要们因为使用信令显式通知)
部分SDP body的使用会被显式通知。例如为SIP使用不同的MIME类型,或者为WebRTC API使用不同的type。
作者认知到该技术需要更正式的定义。这些留给合适的未来研究。对于WebRTC,我们希望增加一个constraint来createOffer,来请求生成partial offer。生成的RTCSessionDescription会包含从最近一次offer/answer交换之后改变了的mline,会包含“partialOffer”的type。接受partialOffer之后createAnswer,会创建partialAnswer,只包含partial offer中引用的mline。把这个partialAnswer交给远端。
3.4.1 增加stream
。。。略
3.4.2 修改stream
略
3.4.3 移除stream
略
3.5 stream顺序协商
略
3.6 遗留用法的兼容性
略
4. 例子
所有例子中有多行是由于列宽限制被折行。应该明白真正SDP中是不会折行的。
本草案的IP地址的使用惯例是NAT之后的私有地址来自192.0.2.0/24,NAT的公有地址是来自198.51.100.0/24,TURN地址是来自203.0.113.0/24。一般Offer以.1结尾,Answer以.2结尾。
例子没有包括RTCWeb中使用的所有SDP(参见https://tools.ietf.org/html/rfc8834),因为那样让例子难于阅读,相反应该专注于对多路复用关键的例子。
4.1 单audio和单video的简单例子
下面的SDP显示了提供audio和video同时带有既是STUN又是TURN的地址。也为了不支持BUNDLE语义的回答者显示唯一的payload type。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:074c6550
a=ice-pwd:a28a397a4c3f31747d1ee3474af08a068
a=fingerprint:sha-1
99:41:49:83:4a:97:0e:1f:ef:6d:f7:c9:c7:70:9d:1f:66:79:a8:07
a=group:BUNDLE m1 m2
m=audio 56600 RTP/SAVPF 0 109
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 33424
a=mid:m1
a=ssrc:53280
a=rtpmap:0 PCMU/8000
a=rtpmap:109 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 56602 RTP/SAVPF 99 120
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 35969
a=mid:m2
a=ssrc:49843
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:120 VP8/90000
a=sendrecv
a=rtcp-mux
a=candidate:3 1 UDP 2113667327 192.0.2.1 54402 typ host
a=candidate:4 2 UDP 2113667326 192.0.2.1 54403 typ host
a=candidate:3 1 UDP 694302207 198.51.100.1 55502 typ srflx raddr
192.0.2.1 rport 54402
a=candidate:4 2 UDP 169430220 198.51.100.1 55503 typ srflx raddr
192.0.2.1 rport 54403
a=candidate:3 1 UDP 73545215 203.0.113.1 56602 typ relay raddr
192.0.2.1 rport 54402
a=candidate:4 2 UDP 51989708 203.0.113.1 56603 typ relay raddr
192.0.2.1 rport 54403
下面显示了不支持BUNDLE或者rtcp-mux的设备的answer。
v=0
o=- 16833 0 IN IP4 198.51.100.2
s=
t=0 0
c=IN IP4 203.0.113.2
a=ice-ufrag:c300d85b
a=ice-pwd:de4e99bd291c325921d5d47efbabd9a2
a=fingerprint:sha-1
91:41:49:83:4a:97:0e:1f:ef:6d:f7:c9:c7:70:9d:1f:66:79:a8:03
m=audio 60600 RTP/SAVPF 109
a=msid:ma ta
a=rtpmap:109 opus/48000
a=ptime:20
a=sendrecv
a=candidate:0 1 UDP 2113667327 192.0.2.2 60400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.2 60401 typ host
a=candidate:0 1 UDP 1694302207 198.51.100.2 60500 typ srflx raddr
192.0.2.2 rport 60400
a=candidate:1 2 UDP 1694302206 198.51.100.2 60501 typ srflx raddr
192.0.2.2 rport 60401
a=candidate:0 1 UDP 73545215 203.0.113.2 60600 typ relay raddr
192.0.2.1 rport 60400
a=candidate:1 2 UDP 51989708 203.0.113.2 60601 typ relay raddr
192.0.2.1 rport 60401
m=video 60602 RTP/SAVPF 99
a=msid:ma tb
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=4d0028;packetization-mode=1
a=sendrecv
a=candidate:2 1 UDP 2113667327 192.0.2.2 60402 typ host
a=candidate:3 2 UDP 2113667326 192.0.2.2 60403 typ host
a=candidate:2 1 UDP 694302207 198.51.100.2 60502 typ srflx raddr
192.0.2.2 rport 60402
a=candidate:3 2 UDP 169430220 198.51.100.2 60503 typ srflx raddr
192.0.2.2 rport 60403
a=candidate:2 1 UDP 73545215 203.0.113.2 60602 typ relay raddr
192.0.2.2 rport 60402
a=candidate:3 2 UDP 51989708 203.0.113.2 60603 typ relay raddr
192.0.2.2 rport 60403
下面显示了支持bundle的设备的answer。
v=0
o=- 16833 0 IN IP4 198.51.100.2
s=
t=0 0
c=IN IP4 203.0.113.2
a=ice-ufrag:c300d85b
a=ice-pwd:de4e99bd291c325921d5d47efbabd9a2
a=fingerprint:sha-1
91:41:49:83:4a:97:0e:1f:ef:6d:f7:c9:c7:70:9d:1f:66:79:a8:03
a=group:BUNDLE m1 m2
m=audio 60600 RTP/SAVPF 109
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 39829
a=mid:m1
a=ssrc:35856
a=rtpmap:109 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.2 60400 typ host
a=candidate:0 1 UDP 1694302207 198.51.100.2 60500 typ srflx raddr
192.0.2.2 rport 60400
a=candidate:0 1 UDP 73545215 203.0.113.2 60600 typ relay raddr
192.0.2.1 rport 60400
m=video 60600 RTP/SAVPF 99
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 45163
a=mid:m2
a=ssrc:2638
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=4d0028;packetization-mode=1
a=sendrecv
a=rtcp-mux
a=candidate:3 1 UDP 2113667327 192.0.2.2 60400 typ host
a=candidate:3 1 UDP 694302207 198.51.100.2 60500 typ srflx raddr
192.0.2.2 rport 60400
a=candidate:3 1 UDP 73545215 203.0.113.2 60600 typ relay raddr
192.0.2.2 rport 60400
4.2 多个video
简单例子显示了单个audio和两个video
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m1 m2 m3
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 47434
a=mid:m1
a=ssrc:32385
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 56602 RTP/SAVPF 96 98
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 22705
a=mid:m2
a=ssrc:43985
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:98 VP8/90000
a=sendrecv
a=rtcp-mux
a=candidate:2 1 UDP 2113667327 192.0.2.1 54402 typ host
a=candidate:3 2 UDP 2113667326 192.0.2.1 54403 typ host
a=candidate:2 1 UDP 694302207 198.51.100.1 55502 typ srflx raddr
192.0.2.1 rport 54402
a=candidate:3 2 UDP 169430220 198.51.100.1 55503 typ srflx raddr
192.0.2.1 rport 54403
a=candidate:2 1 UDP 73545215 203.0.113.1 56602 typ relay raddr
192.0.2.1 rport 54402
a=candidate:3 2 UDP 51989708 203.0.113.1 56603 typ relay raddr
192.0.2.1 rport 54403
a=ssrc:11111 cname:45:5f:fe:cb:81:e9
m=video 56604 RTP/SAVPF 96 98
a=msid:ma tc
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 64870
a=mid:m3
a=ssrc:54269
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:98 VP8/90000
a=sendrecv
a=rtcp-mux
a=candidate:4 1 UDP 2113667327 192.0.2.1 54404 typ host
a=candidate:5 2 UDP 2113667326 192.0.2.1 54405 typ host
a=candidate:4 1 UDP 694302207 198.51.100.1 55504 typ srflx raddr
192.0.2.1 rport 54404
a=candidate:5 2 UDP 169430220 198.51.100.1 55505 typ srflx raddr
192.0.2.1 rport 54405
a=candidate:4 1 UDP 73545215 203.0.113.1 56604 typ relay raddr
192.0.2.1 rport 54404
a=candidate:5 2 UDP 51989708 203.0.113.1 56605 typ relay raddr
192.0.2.1 rport 54405
a=ssrc:22222 cname:45:5f:fe:cb:81:e9
4.3 很多video
本小节添加3个video和一个audio。video这样发送,使用3.1描述的bundle only方法使只有远端支持bundle他们才被接受。这些video都使用相同的payloadtype,所以如果不适用SSRC值就不可能解复用。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1 m2 m3
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 6614
a=mid:m0
a=ssrc:12359
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=ssrc:12359 cname:45:5f:fe:cb:81:e9
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 0 RTP/SAVPF 96 98
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 24147
a=mid:m1
a=ssrc:26989
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:98 VP8/90000
a=sendrecv
a=rtcp-mux
a=bundle-only
a=ssrc:26989 cname:45:5f:fe:cb:81:e9
m=video 0 RTP/SAVPF 96 98
a=msid:ma tc
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 33989
a=mid:m2
a=ssrc:32986
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:98 VP8/90000
a=sendrecv
a=rtcp-mux
a=bundle-only
a=ssrc:32986 cname:45:5f:fe:cb:81:e9
m=video 0 RTP/SAVPF 96 98
a=msid:ma td
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 61408
a=mid:m3
a=ssrc:46986
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1
a=rtpmap:98 VP8/90000
a=sendrecv
a=rtcp-mux
a=bundle-only
a=ssrc:46986 cname:45:5f:fe:cb:81:e9
4.4 带simulcast的多video
本小节展示带有一个audio和两个video,每个video发送两种分辨率。一个video支持VP8,另一个支持H264。所有video都是bundle-only。注意使用了不同的编解码专用参数导致使用了两个不同的payload type。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1 m2
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 31727
a=mid:m0
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 0 RTP/SAVPF 96 100
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 41664
b=AS:1756
a=mid:m1
a=rtpmap:96 VP8/90000
a=ssrc-group:SIMULCAST 58949 28506
a=ssrc:58949 imageattr:96 [x=1280,y=720]
a=ssrc:28506 imageattr:96 [x=640,y=480]
a=sendrecv
a=rtcp-mux
a=bundle-only
m=video 0 RTP/SAVPF 96 100
a=msid:ma tc
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 14460
b=AS:1756
a=mid:m2
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4d0028;packetization-mode=1;max-fr=30
a=rtpmap:100 H264/90000
a=fmtp:100 profile-level-id=4d0028;packetization-mode=1;max-fr=15
a=ssrc-group:SIMULCAST 18875 54986
a=ssrc:18875
a=ssrc:54986
a=sendrecv
a=rtcp-mux
a=bundle-only
4.5 带Simulcast和RTX的video
本小节展示了单个audio和单个video。video用两种分辨率simulcast,并且有【rfc4588】风格的重传flow。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 42123
a=mid:m0
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 0 RTP/SAVPF 96 101
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 60725
b=AS:2500
a=mid:m1
a=rtpmap:96 VP8/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=96;rtx-time=3000
a=ssrc-group:SIMULCAST 78909 43567
a=ssrc-group:FID 78909 56789
a=ssrc-group:FID 43567 13098
a=ssrc:78909
a=ssrc:43567
a=ssrc:13098
a=ssrc:56789
a=sendrecv
a=rtcp-mux
a=bundle-only
4.6 带有simulcast和fec的video
本小节展示了单个audio和单个video。video用两种分辨率simulcast,并且有【rfc5956】风格的FEC flow。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 42123
a=mid:m0
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 0 RTP/SAVPF 96 101
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 60725
b=AS:2500
a=mid:m1
a=rtpmap:96 VP8/90000
a=rtpmap:101 1d-interleaved-parityfec/90000
a=fmtp:96 max-fr=30;max-fs=8040
a=fmtp:101 L=5; D=10; repair-window=200000
a=ssrc-group:SIMULCAST 56780 34511
a=ssrc-group:FEC-FR 56780 48675
a=ssrc-group:FEC-FR 34511 21567
a=ssrc:56780
a=ssrc:34511
a=ssrc:21567
a=ssrc:48675
a=sendrecv
a=rtcp-mux
a=bundle-only
4.7 带有分层编码的video
本小节展示了单个audio和单个video。video stream带有3个不同分辨率基于RFC5583的分层编码。video的mline展示了3个stream,最后一个(payload 100)独立于PT96 和97的解码。
v=0
o=- 20518 0 IN IP4 198.51.100.1
s=
t=0 0
c=IN IP4 203.0.113.1
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=fingerprint:sha-1
42:89:c5:c6:55:9d:6e:c8:e8:83:55:2a:39:f9:b6:eb:e9:a3:a9:e7
a=group:BUNDLE m0 m1
m=audio 56600 RTP/SAVPF 0 96
a=msid:ma ta
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 42123
a=mid:m0
a=rtpmap:0 PCMU/8000
a=rtpmap:96 opus/48000
a=ptime:20
a=sendrecv
a=rtcp-mux
a=candidate:0 1 UDP 2113667327 192.0.2.1 54400 typ host
a=candidate:1 2 UDP 2113667326 192.0.2.1 54401 typ host
a=candidate:0 1 UDP 694302207 198.51.100.1 55500 typ srflx raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 169430220 198.51.100.1 55501 typ srflx raddr
192.0.2.1 rport 54401
a=candidate:0 1 UDP 73545215 203.0.113.1 56600 typ relay raddr
192.0.2.1 rport 54400
a=candidate:1 2 UDP 51989708 203.0.113.1 56601 typ relay raddr
192.0.2.1 rport 54401
m=video 0 RTP/SAVPF 96 97 100
a=msid:ma tb
a=extmap:1 urn:ietf:params:rtp-hdrext:stream-correlator 60725
b=AS:2500
a=mid:m1
a=rtpmap:96 H264/90000
a=fmtp:96 max-fr=30;max-fs=8040
a=rtpmap:97 H264/90000
a=fmtp:97 max-fr=15;max-fs=1200
a=rtpmap:100 H264-SVC/90000
a=fmtp:100 max-fr=30;max-fs=8040
a=depend:100 lay m1:96,97;
a=ssrc:48970
a=ssrc:90898
a=ssrc:66997
a=sendrecv
a=rtcp-mux
a=bundle-only