关于javascript:WebRTC:频道,曲目之间的关系

WebRTC: Relationship between Channels, Tracks & Streams vis-a-vis RTP SSRC and RTP Sessions

在Mozilla网站上:https://developer.mozilla.org/en-US/docs/Web/API/Media_Streams_API

" MediaStream由零个或多个MediaStreamTrack对象组成,代表各种音频或视频Rails。每个MediaStreamTrack可以具有一个或多个通道。通道代表媒体流的最小单位,例如与音频流相关联的音频信号。给定的扬声器,例如立体声音频Rails中的左或右。"

这澄清了一个频道。

最近有几个RFC(例如8108)表示需要在一个RTP会话中发送多个流。每个流在RTP级别上都有自己的SSRC。
同样在RFC for Unified Plan中,引用始终始终是最低级别的流(而不是Rails或通道)。在RFC 3550(基本RTP RFC)中,没有对通道的引用。

这些RFC中是否提到了RTP流,这建议该流是最低的媒体源,与WebRTC中使用的术语相同,并且如上所述。
在Rails(WebRTC)和带有SSRC的RTP流之间是否存在一对一映射?

例如,网络摄像头生成媒体流,该媒体流可以具有音频媒体Rails和视频媒体Rails,每个Rails使用单独的SSRC以RTP数据包的形式传输,从而产生两个SSRC。那是对的吗?现在,如果有立体声网络摄像头(或带有这样的设备,比如说两个麦克风-通道),该怎么办?这会生成带有三个不同的唯一SSRC的三个RTP流吗?

在成功测试ICE候选人之后,是否为五元组连接建立了一个RTP会话?还是在同级之间的同一组端口-ip-UDP连接上存在多个RTP会话?

任何澄清这一点的文件将不胜感激。


That clarifies what a channel is.

不完全是。只有音轨才有频道。除非您使用Web音频将音频MediaStreamTrack分成单独的通道,否则就对等连接而言,该音轨是最低级别的。 *

这是因为多个音频通道(与视频的多个帧非常相似)是由编解码器进行编码和解码的有效载荷的一部分。实际上,您可以在接收器的MedaiStreamTrack上使用Web音频分配器来分配音频通道,只要它们能幸免。

*)也有数据通道,但是它们是不同的,并且与媒体流和Rails无关。

Is the RTP stream ... the same as channels as that term is used in WebRTC, and as referenced above?

不。粗略地说,您可以说:

RTP流== MediaStreamTrack。

但这不是全部,因为sender.replaceTrack(withTrack)。简而言之,您可以在实时通话中随时将要发送的音轨替换为其他音轨,而无需重新协商连接。重要的是,在这种情况下,另一方的receiver.track不会更改,只有其输出会更改。这会将管道与通过管道的内容分开。

因此在发送方,更公平地说:

RTP流==当前输出发件人(来自pc.getSenders())

...而在接收方,它更简单,而且总是这样:

RTP流== receiver.track

有道理吗?

那MediaStream呢?

在现代WebRTC中,MediaStream是笨拙的容器-"您可以使用stream.addTrack(track)stream.removeTrack(track) a随意添加或删除Rails"。此外,RTCPeerConnection仅处理Rails。例如:

1
2
3
for (const track of stream.getTracks()) {
  pc.addTrack(track, stream);
}

Is there a one-to-one mapping between channels of a track and RTP stream with a SSRC?

MediaStreamTrack和SSRC之间,是的。

A webcam, [...] can have a audio media track and a video media track, each track is transported in RTP packets using a separate SSRC, resulting in two SSRCs. Is that correct?

在这种情况下是的,因为音频永远不会与视频捆绑在一起,反之亦然。

Now what if there is a stereo webcam

没有区别。立体声音频Rails仍然是单个音频Rails(和单个RTP流)。

Or can there be multiple RTP sessions over the same set of port-ip-UDP connection between peers?

不同时。但是,除非使用非默认值,否则多个Rails可以共享同一会话:

1
new RTCPeerConnection({bundlePolicy: 'max-compat'});

如果您不这样做,或使用任何其他方式,则相同种类的曲目可能会捆绑到单个RTP会话中。