我很难确定哪个轨道属于接收端的哪个媒体源。在统一计划中,有什么方法可以在收发器上定义自定义属性?
答案 0 :(得分:2)
我很难确定接收方哪个轨道属于哪个媒体源。
使用相关视频流的transceiver.mid
或stream.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对象可以在其上定义一个属性。但是我怀疑那不是你的意思。
mid
和stream.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解析规则的约束,因此请小心。