mediasoup v3 API 之二 Transport

WebRtcTransport

  • Mediasoup 内部有多种 Transport 实现,其中 WebRtcTransport 的实现是基于 ICE Lite(精简版ICE)。
  • WebRtcTransport 主要用来进行 client 端 与 mediasoup server 端 Router 进行通讯。
  • ICE Lite: meaning that it does not initiate ICE connections but expects ICE Binding Requests from endpoints.
    • FULL ICE:是双方都要进行连通性检查,完成的走一遍流程。
    • Lite ICE: 在FULL ICE和Lite ICE互通时,只需要FULL ICE一方进行连通性检查, Lite一方只需回应response消息。这种模式对于部署在公网的设备比较常用。

WebRtcTransportOptions

WebRtcTransport 类型的选项参数

FieldTypeDescriptionRequiredDefault
listenIpsArray<TransportListenIp|String>Listening IP address or addresses in order of preference (first one is the preferred one).Yes
enableUdpBooleanListen in UDP.Notrue
enableTcpBooleanListen in TCP.Nofalse
preferUdpBooleanListen in UDP.Nofalse
preferTcpBooleanListen in TCP.Nofalse
initialAvailableOutgoingBitrateNumberInitial available outgoing bitrate (in bps).No600000
enableSctpBoolean Create a SCTP association.Nofalse
numSctpStreamsNumSctpStreamsSCTP streams number.No
maxSctpMessageSizeNumberMaximum allowed size for SCTP messages sent by DataProducers.No262144
appDataObjectCustom application data.No{}
  1. 从上表即可得知,WebRtcTransport 传输层协议优先使用的是 UDP,并且支持 TCP 以及 SCTP.
  2. ip 可配置多个,但是从描述来看,第一个 prefered。那么多网卡,多ip时,内部实现,可能是更多偏向于主备,而非负载。

Note:

  1. 不要使用 “0.0.0.0”。
    socket 层 “0.0.0.0” 是什么?
    说白了,就是 0. 但是这个点分十进制的0,其实是 IPv4的 0.
    “00::00::00::00"或者"0::0”:类似这种,才是IPv6的 0.
    在socket server 编程的时候,如果 bind 中的ip地址为 0。那么底层怎么做呢?
    底层相当于不绑定,不分配IP,dst为任意的一个本机 ip 的数据包,到本机,都会被留下来,而回复时,哪儿来的往哪儿回,主动发送,就随机挑个ip。这种情况下,相对而言比较灵活,但是针对于多网卡多ip机器而言,这种自动分配的方式就不是很靠谱,尤其是需要ICE去解决NAT穿透的问题场景下,更麻烦。
    所以在创建WebRtcTransport时,建议不要这么干。
  2. 如果你配置了"0.0.0.0","::",那么在对应的位置,必须配置announcedIp。
  3. initialAvailableOutgoingBitrate:这个配置,仅仅在 endpoint的 Consumer 端,使用了REMB or Transport-CC 其中之一的码率控制算法(可能不仅仅是拥塞)时,才会被采用。

IceParameters

usernameFragment: string 类型,指定 ICE 的 ufrag
password: string 类型,指定 ICE 的 password
iceLite: 指定是否采用 ICE Lite

IceCandidate

DtlsParameters

DtlsFingerprint

enum

  • IceState
  • DtlsRole
  • DtlsState

属性

webRtcTransport.iceRole
webRtcTransport.iceParameters
webRtcTransport.iceCandidates
webRtcTransport.iceState
webRtcTransport.iceSelectedTuple
webRtcTransport.dtlsParameters
webRtcTransport.dtlsState
webRtcTransport.dtlsRemoteCert
webRtcTransport.sctpParameters
webRtcTransport.sctpState

行为

webRtcTransport.getStats()
// 获取 webRtcTransport 的 RTC 的 statistics
webRtcTransport.connect({ dtlsParameters })
// 根据 dtlsParameters 建立与 endpoint 端的 webRtcTransport
webRtcTransport.restartIce()
// 重启 ICE 层的连接,获取新的参数,并且,新参数应当及时通知给 remote endpoint

事件

WebRtcTransport events

webRtcTransport.on(“icestatechange”, fn(iceState))
监控 ICE 连接的状态变化
webRtcTransport.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
ICE state 变成完成(completed)之后,如果 ICE 选择的连接 tuple 发生变化,那么会触发该事件。
该 TransportTuple 就是前文已述的 local ip/port, remote ip/port + protocol 的数据结构。
webRtcTransport.on(“dtlsstatechange”, fn(dtlsState))
DTLS 的连接发生状态变化,会被触发,具体状态跳转参考 DtlsState 定义
webRtcTransport.on(“sctpstatechange”, fn(sctpState))
SCTP 的连接发生状态变化,会被触发,具体状态跳转参考 TransportSctpState 定义

WebRtcTransport observer events

其实是上面 4 个事件的重复而已。
webRtcTransport.observer.on(“icestatechange”, fn(iceState))
webRtcTransport.observer.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
webRtcTransport.observer.on(“dtlsstatechange”, fn(dtlsState))
webRtcTransport.observer.on(“sctpstatechange”, fn(sctpState))

PlainRtpTransport (DEPRECATED)

( mediasoup.version < 3.5.0 )

PlainTransport

( mediasoup.version >= 3.5.0 )
PlainTransport 主要用于 RTP/RTCP (或者采用安全的srtp)以及 SCTP(DataChannel)的通讯连接。

PlainTransportOptions

FieldTypeDescriptionRequiredDefault
listenIpTransportListenIp|StringListening IP address.Yes
rtcpMuxBooleanRTP & RTCP 采用统一端口Notrue
comediaBoolean自动检测功能(使用第一个收到的rtp packet的对端ip:port),作为remote endpoint的ip:port。另只能在开启了SRTP 情况下,在从远端收到了对应的参数srtpParameters时,connect() 才能被调用。(见下文Note)Nofalse
enableSctpBooleanCreate a SCTP association.Nofalse
numSctpStreamsNumSctpStreamsSCTP streams number.No
maxSctpMessageSizeNumberMaximum allowed size for SCTP messages sent by DataProducers.No262144
enableSrtpBooleanEnable SRTP to encrypt RTP and SRTP. If enabled, the remote must also enable SRTP.Nofalse
srtpCryptoSuiteSrtpCryptoSuiteJust valid if enableSrtp is set.No“AES_CM_128_HMAC_SHA1_80”
appDataObjectCustom application data.No{}

Note:

  • comedia: 字段,仅仅当 remote endpoint 会通过该 plaintransport produce RTP(SCTP) 数据包发送过来,才有意义。否则,当endpoint端不发送RTP/SCTP数据到 mediasoup server,那么,mediasoup也无法检测其ip:port,也就无法发送任何数据包到endpoint了。
  • 换句话说,如果 remote endpoint端,并不打算produce数据,而仅仅是consume,那么comedia模式,便不要开启,而应该调用 connect() 接口,ip:port 采用之前信令协商的ip:port.
  • PlainTransport 支持 RTP/RTCP 的mux技术。

属性

plainTransport.tuple
如果 RTCP-mux is set,那么该tuple 包含 RTP & RTCP的信息。
当 plain transport被创建,该tuple 中的 localIp,localPort,protocol会被设置。
但是 remote 部分:

  1. 通过上面提到过的 comedia 的模式自动填充。
  2. connect() 调用主动处理填充。

plainTransport.rtcpTuple
参考 plainTransport.tuple,该属性,标识的是 rtp 部分。

plainTransport.sctpParameters

plainTransport.sctpState

plainTransport.srtpParameters

行为/方法

plainTransport.getStats()
plainTransport.connect({ ip, port, rtcpPort, srtpParameters })

事件

plainTransport 事件

plainTransport.on(“tuple”, fn(tuple))
当开启了 comedia 模式,mediasoup 收到 endpoint 过来的RTP/SCTP数据包,获取到endpoint的ip:port,就会触发该事件。
plainTransport.on(“rtcptuple”, fn(rtcpTuple))
如上类似,但是还要外加一个条件。即: comedia set + RTCP-mux not set
plainTransport.on(“sctpstatechange”, fn(sctpState))

plainTransport observer 事件

plainTransport.observer.on(“tuple”, fn(tuple))
plainTransport.observer.on(“rtcptuple”, fn(rtcpTuple))
plainTransport.observer.on(“sctpstatechange”, fn(sctpState))

PipeTransport

与 plaintransport 类似,但是,通讯双方不再是 remote endpoint 与 mediasoup,而是同一个主机上的两个 Router。但是文档中没说是否跨 Worker,那么有可能是跨 Worker 也就是跨进程,也有可能是同一个进程。

DirectTransport

通讯双方: medisoup node.js process 与 mediasoup-worker subprocess 中的某个 Router。
目前,nodejs 可以通过在 direct transport 上直接创建的DataProducers & DataConsumers 进行数据消息的发送和接收。
基于 directtransport 上的 DataProducer 发送的消息,可以被支持 SCTP 连接的(如: WebRtcTransport, PlainTransport, PipeTransport) endpoint 消费;也可以被 Node.js 应用中的基于 direct transport 创建的 DataConsumer 消费。
反之亦然:通过 SCTP/DataChannel 发出来的消息,也可以被 Node.js 应用中的 基于 DirectTransport 创建的 DataConsumer 消费。

DirectTransportOptions

maxMessageSize: 262144
appData: {}

属性

参考 Transport

行为/方法

directTransport.getStats()
directTransport.connect()

不支持的方法

以下三个方法,不支持,如果调用,就会报错: UnsupportedError.

  • directTransport.setMaxIncomingBitrate(options)
  • directTransport.produce(options)
  • directTransport.consume(options)

事件

参考 Transport 事件,未定义更多的事件。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值