diginext-utils
Version:
README.md
181 lines • 8.59 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getWebcam = getWebcam;
const requestCamera_1 = require("../permission/requestCamera");
function getWebcam(params = { facingMode: "environment", audio: true }) {
if (typeof window == "undefined")
return;
const { container, facingMode = "environment", audio = true } = params;
const _container = container || document.body;
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
const video = document.createElement("video");
video.style.position = "absolute";
video.style.top = "0";
video.style.left = "0";
video.style.width = "100%";
video.style.height = "100%";
_container.append(video);
let inputCameras = [];
let currentCamera;
const requestedMediaConstraints = {
video: {
facingMode: { exact: facingMode },
},
audio,
};
console.log("[Camera.js] Requesting:", requestedMediaConstraints);
const res = yield (0, requestCamera_1.requestCamera)({ audio });
if (!res) {
setTimeout(function () {
handleError({ name: "Error", message: "NotSupported" });
}, 50);
}
// start requesting media permissions:
// console.log("[Camera.js] Requesting:", requestedMediaConstraints);
// if (navigator.mediaDevices.enumerateDevices === undefined) {
// setTimeout(function () {
// handleError({ name: "Error", message: "NotSupported" });
// }, 50);
// } else {
navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
// }
function parseDevices(devices) {
inputCameras = [];
let backCameras = [];
devices.forEach(function (device) {
if (device.kind == "videoinput" && typeof device.deviceId != "undefined" && device.deviceId != "") {
inputCameras.push(device);
}
});
// //alert (JSON.stringify (devices));
console.log("[Camera.js] inputCameras:", inputCameras);
if (inputCameras.length > 0) {
let cams = "";
let backCamera;
inputCameras.map((cam) => {
cams += `[${cam === null || cam === void 0 ? void 0 : cam.deviceId}] ${cam === null || cam === void 0 ? void 0 : cam.kind} | ${cam === null || cam === void 0 ? void 0 : cam.label}\n`;
// console.log(cam);
let label = cam.label.toLowerCase();
if (label.indexOf("back") > -1 || label.indexOf("facetime") > -1) {
backCamera = cam;
backCameras.push(backCamera);
}
});
if (backCameras.length > 1) {
backCamera = backCameras[backCameras.length - 1];
}
else if (backCameras.length == 0) {
backCamera = inputCameras[0];
backCameras.push(backCamera);
}
console.log(`[Camera.js] All input sources:`, cams);
console.log(`[Camera.js] This device has ${backCameras.length} back camera${backCameras.length > 1 ? "s" : ""}.`);
console.log("[Camera.js] backCameras:", JSON.stringify(backCameras));
currentCamera = backCamera;
// if (scope.onGotDevices) {
// scope.onGotDevices(devices);
// }
// Lấy stream của camera sau
// (Lấy cái cuối cùng trong danh sách trước, thường sẽ là camera chính trên Android)
getStreamOfCameraId(backCamera.deviceId)
.then(onStreamReceived)
.catch((e) => {
if (backCameras.length > 1) {
// nếu thiết bị có nhiều hơn 1 camera sau -> thử lấy camera khác
backCamera = backCameras[backCameras.length - 2];
getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
}
else if (backCameras.length > 2) {
// nếu thiết bị có nhiều hơn 2 camera sau -> thử lấy camera khác nữa
backCamera = backCameras[backCameras.length - 3];
getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
}
else {
// nếu thiết bị đéo có camera sau...
handleError(e);
}
});
}
else {
navigator.mediaDevices
.getUserMedia(requestedMediaConstraints)
.then(onStreamReceived)
.catch(handleError);
// if (scope.onGotDevicesFailed) scope.onGotDevicesFailed();
}
}
function onStreamReceived(stream) {
if (inputCameras.length == 0) {
console.log("[Camera.js] Not found any back cameras, request again?");
navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
return;
}
playWebcamVideo(stream);
}
function playWebcamVideo(_stream) {
if ("srcObject" in video) {
// //alert ('GOT STREAM VIDEO OBJECT');
video.srcObject = _stream;
}
else {
// //alert ('GOT STREAM VIDEO SOURCE URL');
// Avoid using this in new browsers, as it is going away.
video.src = window.URL.createObjectURL(_stream);
}
// required to tell iOS safari we don't want fullscreen
video.setAttribute("playsinline", "true");
video.setAttribute("muted", "true");
video.setAttribute("autoplay", "true");
video.muted = true;
video.autoplay = true;
video.style.objectFit = "cover";
video.play();
// auto play
video.addEventListener("canplay", function () {
// //alert ('CAN PLAY');
});
video.addEventListener("canplaythrough", function () {
// //alert ('CAN PLAY THROUGH');
});
video.addEventListener("error", (e) => console.log("[Camera.js] <video> error:", e));
video.addEventListener("stalled", function (e) {
// //alert ('CANNOT GET METADATA');
console.log("[Camera.js] <video> stalled:", e);
reject();
});
video.addEventListener("loadedmetadata", function () {
if (currentCamera.label.toLowerCase().indexOf("facetime") > -1) {
video.style.transform = "scaleX(-1)";
video.style.webkitTransform = "scaleX(-1)";
}
video.play();
resolve(video);
});
}
function getStreamOfCameraId(id) {
const constraints = {
video: { deviceId: { exact: id } },
audio: false,
};
return new Promise((resolve, reject) => {
navigator.mediaDevices.getUserMedia(constraints).then(resolve).catch(reject);
});
}
function handleError(err) {
console.error(err);
const errMsg = "[Camera.js] " + err.name + ": " + err.message;
console.error(errMsg);
reject();
}
}));
}
//# sourceMappingURL=camera.js.map