在我的 webrtc 客户端程序中(javascript,在 1 个本地主机上调试两个对等点)
negotiationneeded
事件被调用 2 次。getUserMedia
,然后调用 addtrack()
将音频和视频轨道发送到遥控器,尽管我总是只使用 1 个麦克风和 1 个摄像头,并且不会更改它们的参数。negotiationneeded
事件) * (每个事件 2 首曲目)。问题是:
getSenders()
返回 4 首曲目是否正确?这是否意味着遥控器将获得比实际需要 (1 + 1) 多 2 倍的数据 (2音频 + 2视频)?replacetrack()
而不是 addtrack()
来消除重复?PS:在
streams
提出的问题中,我的意思不是 MediaStream
对象,而是在 webrtc 对等点之间流动的带有视频或音频的真实数据流。
简短的回答 - 在收到
negotiationneeded
事件后,您不需要再次添加曲目。
negotiationneeded
仅表示对等方需要 SDP 提议-答案交换,以便他们了解如何传输新曲目。这种交换对于同行就要使用的编解码器参数达成一致是必要的。您已添加到连接的曲目将保留在原处。
因此,在
onnegotiationneeded
回调中,您通常会有一个新的 createOffer -> setLocalDescription -> send offer
序列。
轨道不仅代表媒体源,还提供媒体流控制。它们可以被停止、临时禁用等。这就是为什么每次您获得具有新 ID 的新对象时,您都可以单独控制创建的轨道。但是,是的,它们可能代表相同的物理来源。但请记住,在幕后,这些轨道可能针对不同的对等点进行不同的编码。因此,即使来自相同的物理源,对等点之间流动的数据也可能不相同。
这是添加相同曲目两次的结果。是的,您可能会发送相同的数据两次,您可以在 chrome://webrtc-internals 页面中检查这一点。
关于媒体传输,由发送方负责。接收方对发送的媒体的控制有限;它可以忽略它,但媒体仍然会流动。