WebRTC + WebAudio bug
by juberti
HTML
<button onclick="playNewSound()">▶</button>
<button onclick="reconnect()">?</button>
<video muted autoplay/>
<audio autoplay/>
JavaScript
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
var video = document.querySelector("video");
var audio = document.querySelector("audio");
var pc1, pc2;
async function playNewSound() {
audio.play();
audioContext.resume();
createConnection(createLocalStream(), video);
setInterval(() => {
console.log(audioContext.state);
}, 1000);
}
function reconnect() {
audio.play();
video.play();
connectRemoteStream(video.srcObject, video);
}
function createLocalStream() {
var audioContext2 = new AudioContext();
audioContext2.resume();
var oscillator = audioContext2.createOscillator();
oscillator.type = 'sine';
oscillator.frequency.value = 440; // value in hertz
var dest = audioContext2.createMediaStreamDestination();
oscillator.connect(dest);
oscillator.start(0);
return dest.stream;
}
function connectRemoteStream(stream, elem) {
elem.srcObject = stream;
if (0) {
audio.srcObject = stream;
} else {
const mss = audioContext.createMediaStreamSource(stream);
mss.connect(audioContext.destination);
}
}
async function createConnection(stream, elem) {
pc1 = new RTCPeerConnection({}), pc2 = new RTCPeerConnection({});
pc1.addTrack(stream.getTracks()[0], stream);
pc1.onicecandidate = (e) => { if (e.candidate) pc2.addIceCandidate(e.candidate); }
pc2.onicecandidate = (e) => { if (e.candidate) pc1.addIceCandidate(e.candidate); }
pc2.ontrack = (e) => { connectRemoteStream(e.streams[0], elem); }
const offer = await pc1.createOffer();
await pc1.setLocalDescription(offer);
await pc2.setRemoteDescription(offer);
const answer = await pc2.createAnswer();
await pc2.setLocalDescription(answer);
await pc1.setRemoteDescription(answer);
}