流媒体传输协议之 RTP(下篇) (3)

流媒体传输协议之 RTP(下篇)

BYE 报文表示一个或多个流媒体源不再活跃。

version (V),padding (P),length: 同上。

packet type (PT): 8 bits,203 表示 BYE 报文。

source count (SC): 5 bits,退出 Session 的 SSRC 的数量。

如果 BYE 报文被 Mixer 收到了,Mixer 应该啥都不改动,就发给下一节点。如果 Mixer 关闭了,它要发送一个包含它管理的所有 SSRC 的 BYE 报文。BYE 报文中可能也会跟着带一些离开原因的描述。这些描述和 SDES 中带的描述类似,需要 32-bit,用空字节填补空缺。

APP:应用定义的 RTCP 报文

流媒体传输协议之 RTP(下篇)

APP 报文一般用于实验性的功能和开发。如果识别到了不认识 NAME 那么上层应用一般都会忽略它。如果开发或者测试功能稳定了,一般是要通过 IANA 注册一个新的 RTCP 报文类型。

version (V),padding (P),length: 同上。

subtype: 5 bits,APP 报文子类型,一般是上层应用定义。

packet type (PT): 8 bits,204 表示 APP 类型的 RTCP 报文。

name: 4 octets 一般是应用名,防止 subtype 冲突。

application-dependent data: variable length 和上层应用相关的内容,需要 32-bit 对齐。

RTP Translator & Mixer

作为末端节点的补充,RTP 引入了 Translator 和 Mixer 的概念,它们是 RTP 层的中间件。虽然这多少增加了协议的复杂度,但是对音视频通话应用来说它们还是很关键的,因为它们能解决防火墙问题和低带宽连接的问题。

描述

一个 RTP Translator/Mixer 连接至少两个传输层的用户组。通常来说,这里提到的用户组是公共网络的概念,传输层协议会为其生成一个组播地址(ip:port)。网络层协议,像是 IPv4 和 IPv6 对 RTP 协议来说是隐藏的。一个系统可能会有多个 Translator 和 Mixer(多个 Session),它们中的每一个都可以看作是一个用户组的逻辑分割。

为了避免创建在创建 Translator 和 Mixer 造成了网络包循环,必须遵循下列规则:

每个通过连接 Translator 和 Mixer 而加入 Session 的用户组,要么需要网络层隔离,要么最少互相知道这些参数(protocol,address,port)中的一个。

由上一个规则推广的话,各个用户组绝对不能同时连接多个 Translator 或者 Mixer,除非有某种机制能保证他们之间数据被阻断。

Translator:在不改变 RTP 报文 SSRC 的条件下,向后传播该报文,正因为如此,报文的接收者才能识别到 Translator 转发后的报文到底是来自哪个人。有些 Translator 可能直接转发报文,不做任何改动,也有可能改变数据编码,payload 类型和时间戳。

如果多个数据报文被重新编码并合并到一起的话,Translator 必须为这类报文指定一个组新的序列号。这样,输入报文的丢失就会导致输出报文的断层。数据的接收者一般是不知道 Translator 的存在的,除非通过 payload 类型的不同或者传输层报文的源地址来判断。

Mixer:从一个或多个数据源那里接收数据,随后可能会改变数据的格式,然后将这些数据合并,并传递给下家。因为多个数据源的时序并不一定是同步的,所以 Mixer 需要整合各个数据源的时序关系,并将其映射到自己的一套时序上,所以 Mixer 也是一个 SSRC,所有通过 Mixer 的报文必须打上该 Mixer 的 SSRC。

为了表示这些数据的原始数据源,一般会通过 CSRC 列表来记录。有些 Mixer 可能自己也是一个原始数据源,所以他自己的 SSRC 也会出现在 CSRC 列表中。有些应用可能不希望 Mixer 的 SSRC 出现在 CSRC 中,但是这样可能就无法发现循环网络包。

流媒体传输协议之 RTP(下篇)

上图是一个 Mixers 和 Translators 连接的例子。[] 代表末端节点,() 代表 Mixer,<> 代表 Translator,"M1:48 (1, 17)" 表示 Mixer1 的报文,48 是 Mixer1 的 SSRC,括号里的 1,17 是 CSRC,它合并了 E1:17 和 E2:1 这两个节点的数据。

Translator 处理 RTCP

除了要转发数据包,进行数据包的更改,Translator 和 Mixer 也要发送 RTCP 报文。在很多情况下,它会将收到的末端节点的 RTCP 报文合并到复合包中。当再次收到这些包时或者自己的 RTCP 周期到时,它会将复合包发送出去。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxjzf.html