我很难识别哪条轨道属于接收端的哪个媒体源。
使用 transceiver.mid 或者 stream.id 关联流的关联以跟踪轨道。
transceiver.mid
stream.id
收发器有一个 mid ,这是一个唯一的ID,在初始协商后在连接的两端都是相同的。它暴露在这里:
mid
pc.ontrack = event => { const track = event.track; const mid = event.transceiver.mid; }
或者,使用 addTransceiver(track, {streams: [stream]}) 要么 addTrack(track, stream) 并使用 stream.id :
addTransceiver(track, {streams: [stream]})
addTrack(track, stream)
pc.ontrack = event => { const track = event.track; const id = event.streams[0].id; }
在统一计划中,有没有办法在收发器上定义自定义属性?
任何 JS对象可以在其上定义属性。但我怀疑这不是你的意思。
mid 和 stream.id s是协商到远程对等连接的唯一元数据,并且没有正式的方法来添加自定义连接。
建立连接后,您当然可以使用数据通道发送您想要的任何数据。
好吧有办法,但我没有表现出来,因为你还没有说出你用它的原因。在诉诸此之前,请考虑上述选项。 的 使用风险自负! 强>
你可以添加任意数量的 stream.id s并用你想要的任何东西在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解析规则的约束,因此请小心。