RTCPeerConnection: addStream() 方法

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。

RTCPeerConnection 接口的 addStream() 方法将一个 MediaStream 添加为音频或视频的本地源。请注意,此方法已废弃,您应该改为对每个要发送给远程对等端的轨道使用 addTrack() 方法。

如果 signalingState 设置为 closed,则会引发 InvalidStateError。如果 signalingState 设置为 stable,则会在 RTCPeerConnection 上发送 negotiationneeded 事件,以指示必须重复 ICE 协商以考虑新流。

语法

js
addStream(mediaStream)

参数

mediaStream

一个 MediaStream 对象,表示要添加到 WebRTC 对等连接的流。

返回值

无。

示例

这个简单的示例会将来自用户摄像头的音频和视频流添加到连接中。

js
navigator.mediaDevices.getUserMedia({ video: true, audio: true }, (stream) => {
  const pc = new RTCPeerConnection();
  pc.addStream(stream);
});

迁移到 addTrack()

在兼容的情况下,您应该更新您的代码,转而使用 addTrack() 方法。

js
navigator.getUserMedia({ video: true, audio: true }, (stream) => {
  const pc = new RTCPeerConnection();
  stream.getTracks().forEach((track) => {
    pc.addTrack(track, stream);
  });
});

较新的 addTrack() API 避免了关于流的轨道构成是否会影响对等连接(实际上不会)的困惑。

唯一的例外是 Chrome,在 Chrome 中,addStream() *确实* 会使对等连接对后续的流更改变得敏感(尽管此类更改不会触发 negotiationneeded 事件)。如果您依赖于 Chrome 的行为,请注意其他浏览器不具备此行为。您可以使用特性检测来编写兼容 Web 的代码。

js
// Add a track to a stream and the peer connection said stream was added to:

stream.addTrack(track);
if (pc.addTrack) {
  pc.addTrack(track, stream);
} else {
  // If you have code listening for negotiationneeded events:
  setTimeout(() => pc.dispatchEvent(new Event("negotiationneeded")));
}

// Remove a track from a stream and the peer connection said stream was added to:

stream.removeTrack(track);
if (pc.removeTrack) {
  pc.removeTrack(pc.getSenders().find((sender) => sender.track === track));
} else {
  // If you have code listening for negotiationneeded events:
  setTimeout(() => pc.dispatchEvent(new Event("negotiationneeded")));
}

规范

此特性似乎未在任何规范中定义。

浏览器兼容性

另见