I have a web page that is trying to play multiple video stream from two web cam that is attached with the system. Three Cameras attached with my system , one in an in-build camera in the system, second is a usb camera and third is a droid cam client. I can’t play video from system cam and usb cam at a time, I mean droid cam always playing but only one of the other camera at a time.
for example:
- Droid cam and USB Cam = works
- Droid cam and System Camera( in built) = works
- Usb and System Camera = not working
My Code is
let devices = await navigator.mediaDevices.enumerateDevices();
if (devices.length > 0) {
log(`Available Device Count ${devices.length}`);
for (const device of devices) {
let localContraints = { audio: false }
if (device.kind === "videoinput") {
localContraints.video = { deviceId: device.deviceId ? { exact: device.deviceId } : undefined };
var newStream = await navigator.mediaDevices.getUserMedia(localContraints).catch(err => console.log(err + device.label));
if (newStream) {
console.log(`Device Added ${device.label}`);
window.stream.addTrack(newStream.getVideoTracks()[0]);
}
}
}
}
else {
log(`No Devices Available`);
}
Error : could’t load ‘camera label’
two camera stream added in the window object one is always Droid Cam.
first of all I want know is this possible?
Advertisement
Answer
After digging into the issue i found the real problem and a solution. the real problem was asynchronous behavior of java script. so i rewrite the loop. This will help others who facing the similar issue.
$(document).ready(async () =>{
let leftVideo = document.querySelector('video#left');
let rightVideo = document.querySelector('video#right');
let middleVideo = document.querySelector('video#middle');
let videoElemArray = [leftVideo, middleVideo, rightVideo]
let devices = await navigator.mediaDevices.enumerateDevices();
let i = 0;
let videoIndx = 0;
await new Promise(async (resolve, reject) => {
try {
if (devices.length == 0) return resolve();
let funSync = async () => {
if (devices[i].kind === "videoinput") {
var newStream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { deviceId: devices[i].deviceId } });
videoElemArray[videoIndx].srcObject = newStream;
videoIndx++;
}
i++;
if (i == devices.length) return resolve();
else funSync();
}
funSync();
} catch (e) {
reject(e);
}
})
});