javascript - WebRTC: channel 、轨道和流与 RTP SSRC 和 RTP session 之间的关系

标签 javascript webrtc rtp

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

“一个 MediaStream 由零个或多个 MediaStreamTrack 对象组成,代表各种音频或视频轨道。每个 MediaStreamTrack 可能有一个或多个 channel 。 channel 代表媒体流的最小单元,例如与给定关联的音频信号扬声器,如立体声音轨中的左或右。”

这阐明了什么是 channel 。

几个最近的 RFC(例如 8108)提到需要在一个 RTP session 中发送多个流。每个流在 RTP 级别都有自己的 SSRC。 在统一计划的 RFC 中,引用始终是最低级别的流(不是轨道或 channel )。在 RFC 3550 中,基本 RTP RFC,没有对 channel 的引用。

这些 RFC 中提到的 RTP 流是否表明流是媒体的最低来源,与 WebRTC 中使用的 channel 相同,如上文所述? 轨道 channel (WebRTC) 和带有 SSRC 的 RTP 流之间是否存在一对一映射?

例如,网络摄像头生成一个媒体流,它可以有一个音频媒体轨道和一个视频媒体轨道,每个轨道使用单独的 SSRC 在 RTP 数据包中传输,从而产生两个 SSRC。那是对的吗?现在如果有一个立体声网络摄像头(或者一些类似的设备,比如说两个麦克风 - channel ?)。这会生成具有三个不同的唯一 SSRC 的三个 RTP 流吗?

在成功测试 ICE 候选人后,是否有针对五元组连接建立的单个 RTP session ?或者在对等点之间的同一组 port-ip-UDP 连接上可以有多个 RTP session 吗?

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

最佳答案

That clarifies what a channel is.

不完全是。只有音频 轨道有 channel 。除非你使用 web audiosplit up将音频 MediaStreamTrack 放入单独的 channel ,轨道是关于对等连接的最低级别。 *

这是因为多个音频 channel ,就像视频的多个帧一样,是有效载荷的一部分,由编解码器编码和解码。实际上,您可以在接收器的 MedaiStreamTrack 上使用网络音频分离器来分离音频 channel ,前提是它们幸存下来。

*) 还有 data channels , 但它们是不同的,与媒体流和轨道无关。

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 怎么样?

modern WebRTC , MediaStream 是哑容器——您可以使用 stream.addTrack(track)stream.removeTrack(track)< 随意添加或删除轨道—此外,RTCPeerConnection 仅处理tracks。例如:

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

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

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

不是同时。但是多个轨道可以共享同一个 session ,除非你使用非默认:

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

如果你不这样做,或者使用 any other mode , 然后可以将同类轨道捆绑到单个 RTP session 中。

关于javascript - WebRTC: channel 、轨道和流与 RTP SSRC 和 RTP session 之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673672/

相关文章:

javascript - RTCmulticonnection getViewers + onjoin 事件

javascript - Ziggeo、WebRTC 无法读取视频文件

video - 如何在RTP中打包H264?

android - 使用集成 Android 2.3 SIP 堆栈进行加密 VoIP 通信

javascript - 如何显示自定义音频播放器的当前时间和总时长?

javascript - Bootstrap 4 : how to combine the rows into single column or how to give rowspan in bootstrap

javascript - 如何判断 pc.onnegotiationneeded 是否因为流已被删除而被解雇?

android - 通过自己的IP通过RTP进行Android实时音频流传输

javascript - 使用 jQuery/Ajax 通过下拉菜单过滤 PHP SELECT 查询

c# - getelementbyid().length 未定义?