有什么方法可以在统一计划中向收发器添加自定义属性

时间:2019-03-16 11:17:07

标签: webrtc

我很难确定哪个轨道属于接收端的哪个媒体源。在统一计划中,有什么方法可以在收发器上定义自定义属性?

1 个答案:

答案 0 :(得分:2)

  

我很难确定接收方哪个轨道属于哪个媒体源。

使用相关视频流的transceiver.midstream.id关联曲目。

收发器具有mid,这是唯一的ID,在初始协商后,该ID在连接的两端都相同。它在这里暴露:

pc.ontrack = event => {
  const track = event.track;
  const mid = event.transceiver.mid;
}

或者,使用addTransceiver(track, {streams: [stream]})addTrack(track, stream)并使用stream.id

pc.ontrack = event => {
  const track = event.track;
  const id = event.streams[0].id;
}
  

在统一计划中,有什么方法可以定义收发器上的自定义属性?

任何 JS对象可以在其上定义一个属性。但是我怀疑那不是你的意思。

midstream.id是协商到远程对等连接的唯一元数据,并且没有添加自定义元素的正式方法。

建立连接后,您当然可以使用数据通道来发送所需的任何数据。

如何破解自定义元数据

好的,有一种方法,但是我犹豫要显示它,因为您还没有说出它的用途。在使用此选项之前,请考虑以上选项。 使用后果自负!

您可以添加任意数量的stream.id并将它们替换为SPD中的任意内容:

const config = {sdpSemantics: "unified-plan"};
const pc1 = new RTCPeerConnection(config), pc2 = new RTCPeerConnection(config);

const stream = new MediaStream();
pc1.addTransceiver("video", {streams: [stream]});
pc1.msg = "Hello";
pc2.ontrack = event => {
  pc2.msg = event.streams[0].id;
  console.log(pc2.msg);
};

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc1.onnegotiationneeded = async e => {
  await pc1.setLocalDescription(await pc1.createOffer());
  let sdp = pc1.localDescription.sdp.replace(new RegExp(stream.id, 'g'), pc1.msg);
  await pc2.setRemoteDescription({type: "offer", sdp});
  await pc2.setLocalDescription(await pc2.createAnswer());
  await pc1.setRemoteDescription(pc2.localDescription);
}

我实际上并不建议这样做,只是表明可以做到。您在此处输入的任何消息均受SDP解析规则的约束,因此请小心。