Это ошибка в Chrome (пожалуйста, ★, чтобы они это исправили).
В спецификации сказано, что треки приемника должны начинаться muted
и должны оставатьсятаким образом, пока не придут пакеты .Но Chrome запускает событие unmute
немедленно, а через несколько секунд следует событие mute
из-за неактивности ( еще одна ошибка ):
const config = {sdpSemantics: "unified-plan"};
const pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();
pc1.addTransceiver("video");
pc2.ontrack = ({track}) => {
console.log(`track starts out ${track.muted? "muted":"unmuted"}`);
track.onmute = () => console.log("muted");
track.onunmute = () => console.log("unmuted");
};
pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc1.onnegotiationneeded = async e => {
await pc1.setLocalDescription(await pc1.createOffer());
await pc2.setRemoteDescription(pc1.localDescription);
await pc2.setLocalDescription(await pc2.createAnswer());
await pc1.setRemoteDescription(pc2.localDescription);
}
В Chrome вы увидите некорректное поведение:
track starts out muted
unmuted
muted
В Firefox вы увидите правильное поведение:
track starts out muted
Обходной путь Chrome:
Пока Chrome не исправит это, я буду использовать этот обходной путь :
const video = document.createElement("video");
video.srcObject = new MediaStream([track]);
video.onloadedmetadata = () => log("unmuted workaround!");
До тех пор, пока это не сработает, предположим, что дорожка muted
.