const getCamerasScan = async () => {
try {
const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter(device => device.kind === 'videoinput');
let selectedDeviceId;
if (videoDevices.length > 1) {
const backCamera = videoDevices.find(device => device.label.includes('back') || device.label.includes('环境'));
if (backCamera) {
selectedDeviceId = backCamera.deviceId;
} else {
selectedDeviceId = videoDevices[0].deviceId;
}
} else if (videoDevices.length === 1) {
selectedDeviceId = videoDevices[0].deviceId;
}
const constraints = {
video: {
deviceId: selectedDeviceId ? {exact: selectedDeviceId} : true,
facingMode: 'environment'
}
};
const stream = await navigator.mediaDevices.getUserMedia(constraints);
const video = document.createElement('video');
video.style.width = '250px'
video.style.height = '250px'
video.style.position = 'fixed'
video.style.top = '25%'
video.style.left = '20%'
document.querySelector('#reader').appendChild(video)
video.srcObject = stream;
video.play();
await new Promise((resolve) => {
video.oncanplay = resolve;
});
const detector = new BarcodeDetector({
formats:
['aztec', 'code_128', 'code_39', 'code_93', 'codabar', 'data_matrix', 'ean_13', 'ean_8', 'itf',
'pdf417', 'qr_code', 'upc_a', 'upc_e', 'unknown']
});
async function scanLoop() {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
while (true) {
await new Promise(resolve => setTimeout(resolve, 1000));
context.drawImage(video, 0, 0, canvas.width, canvas.height);
try {
await new Promise(resolve => requestAnimationFrame(resolve));
const barcodes = await detector.detect(canvas);
if (barcodes.length > 0) {
console.log(barcodes[0].rawValue, '扫描出来的信息')
stream.getTracks().forEach(track => track.stop());
break;
}
} catch (error) {
console.error('扫描失败:', error);
}
}
}
scanLoop();
} catch (error) {
console.error('无法访问摄像头:', error);
}
}