i need to switch camera during video call . here is my code
this code run when video call connect
function initializeLocalMedia(options, callback) {
if (options) {
options['audio'] = true;
if (options['video'])
options['video'] = true;
} else {
options['audio'] = true;
options['video'] = false;
}
navigator.mediaDevices.enumerateDevices().then(function (devices) {
var cameras = [];
devices.forEach(function (device) {
'videoinput' === device.kind && cameras.push(device.deviceId);
});
var defaultsOpts = { audio: false, video: true }
defaultsOpts.video = { facingMode: shouldFaceUser ? 'user' : 'environment' }
var constraints = { video: { deviceId: { exact: cameras[1] } }, audio: true };
navigator.mediaDevices.getUserMedia(defaultsOpts).then(function (_stream) {
stream = _stream;
window.localStream = stream;
myapp.setMyVideo(window.localStream)
if (callback)
callback();
}, function (err) {
console.log("The following error occurred: " + err.name);
alert('Unable to call ' + err.name)
});
});
}
and this code for flip camera
flipBtn.addEventListener('click', function () {
if (stream == null) return
// // we need to flip, stop everything
stream.getTracks().forEach(t => {
t.stop();
});
// // toggle / flip
shouldFaceUser = !shouldFaceUser;
// capture();
var defaultsOpts = { audio: false, video: true }
defaultsOpts.video = { facingMode: shouldFaceUser ? 'user' : 'environment' }
//var constraints = { video: { deviceId: { exact: cameras[1] } }, audio: true };
navigator.mediaDevices.getUserMedia(defaultsOpts).then(function (_stream) {
stream = _stream;
replaceTracks(stream);
}, function (err) {
console.log("The following error occurred: " + err.name);
alert('Unable to call ' + err.name)
});
})
function replaceTracks(newStreamm) {
//console.log(window.RTCPeerConnection);
detachMediaStream();
newStreamm.getVideoTracks().forEach(function (track) {
track.stop();
});
var configuration = {
iceServers: [{ urls: "stun:stun.1.google.com:19302" }]
};
//var candidate = new RTCIceCandidate(msg.candidate);
attachMediaStream(newStreamm);
// optionally, if you have active peer connections:
_replaceTracksForPeer();
function _replaceTracksForPeer() {
var pc = new RTCPeerConnection();
// var tracks = newStream.getVideoTracks()[0];
// tracks.enabled = true;
pc.getSenders().map(function (sender) {
sender.replaceTrack(newStreamm.getTracks().find(function (track) {
return track.kind === sender.track.kind;
}));
});
}
}
function detachMediaStream() {
var elem = document.getElementById('my-video');
//var elem = document.getElementById(id);
if (elem) {
elem.pause();
if (typeof elem.srcObject === 'object') {
elem.srcObject = null;
} else {
elem.src = '';
}
}
};
function attachMediaStream(newStreamm) {
var elem = document.getElementById('my-video');
if (elem) {
if (typeof elem.srcObject === 'object') {
elem.srcObject = newStreamm;
} else {
elem.src = window.URL.createObjectURL(newStreamm);
}
elem.onloadedmetadata = function (e) {
elem.play();
};
} else {
throw new Error('Unable to attach media stream');
}
};
when i click on flip button remote camera just hang and wont run again.