Мне трудно определить, какой трек принадлежит какому источнику медиа на принимающей стороне.
Использовать transceiver.mid
или stream.id
связанного потока для корреляции дорожек.
Приемопередатчик имеет mid
, который является уникальным идентификатором, одинаковым на обеих сторонах соединения после первоначального согласования.Здесь выставлено:
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
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, поэтому будьте осторожны.