网页端UVC相机测试_艾孜尔江撰
multiCam.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<video id="video" width="400" height="400" style="background-color: coral;"></video>
<video id="video1" width="400" height="400" style="background-color: chartreuse;"></video>
<p>
<canvas id="canvas1" width="400" height="400" style="background-color: blueviolet;"></canvas>
<canvas id="canvas1" width="400" height="400" style="background-color: brown;"></canvas>
</p>
<body>
<script src="./multiCam.js"></script>
</body>
</html>
multiCam.js
:
// 获取页面视频元素
var video = document.getElementById('video');
var video1 = document.getElementById('video1');
navigator.mediaDevices.enumerateDevices().then(getMyDevices).catch(handleError);
// 遍历所有的设备,包括视频和音频设备,找出 RGB相机设备。
function getMyDevices(deviceInfos) {
let constraints = new Array(2);
let id = 0;
for (let i = 0; i !== deviceInfos.length; ++i) {
let deviceInfo = deviceInfos[i];
console.log("device info: " + Object.keys(deviceInfo));
if (deviceInfo.kind === 'videoinput') {
console.log("$$$$$");
console.log("label: " + deviceInfo.label);
// if (deviceInfo.label.search("RGB") !== -1) {
if (deviceInfo.label.search("Full HD webcam") !== -1) {
console.log("deviceID is ###: " + deviceInfo.deviceId);
constraints[id] = {
video: {
deviceId: deviceInfo.deviceId
},
// audio: true,
video: { width: 1280, height: 720 }
};
id = id + 1;
}
}
}
navigator.mediaDevices.getUserMedia(constraints[0]).
then(getStreamFromCamA).catch(handleError);
navigator.mediaDevices.getUserMedia(constraints[0]).
then(getStreamFromCamB).catch(handleError);
}
function getStreamFromCamA(stream) {
window.stream = stream; // make stream available to console
video.srcObject = stream;
video.play();
}
function getStreamFromCamB(stream) {
window.stream = stream; // make stream available to console
video1.srcObject = stream;
video1.play();
}
function handleError(error) {
console.log('Error: ', error);
}
// var id = setInterval(function () {
// console.log("drawing...");
// draw(id)
// }, 24);
function draw(id) {
localStorage.interval_id = id;
let canvas = document.querySelector('canvas');
canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
}
uvc.html
:
<!DOCTYPE html>
<html>
<head>
<title>HTML5 code Reader</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<style type="text/css">
html,
body {
height: 100%;
width: 100%;
text-align: center;
}
</style>
<!-- <script src="jquery-1.9.1.js"></script> -->
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
//这段代 主要是获取摄像头的视频流并显示在Video 签中
var canvas = null, context = null, video = null;
window.addEventListener("DOMContentLoaded", function () {
try {
canvas = document.getElementById("canvas");
context = canvas.getContext("2d");
video = document.getElementById("video");
var videoObj = { "video": true, audio: false },
flag = true,
MediaErr = function (error) {
flag = false;
if (error.PERMISSION_DENIED) {
alert('用户拒绝了浏览器请求媒体的权限', '提示');
} else if (error.NOT_SUPPORTED_ERROR) {
alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
} else if (error.MANDATORY_UNSATISFIED_ERROR) {
alert('指定的媒体类型未接收到媒体流', '提示');
} else {
alert('系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试', '提示');
}
};
//获取媒体的兼容代码,目前只支持(Firefox,Chrome,Opera)
if (navigator.getUserMedia) {
//qq浏览器不支持
if (navigator.userAgent.indexOf('MQQBrowser') > -1) {
alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
return false;
}
navigator.getUserMedia(videoObj, function (stream) {
video.src = stream;
video.play();
}, MediaErr);
}
else if (navigator.webkitGetUserMedia) {
navigator.webkitGetUserMedia(videoObj, function (stream) {
video.src = window.webkitURL.createObjectURL(stream);
video.play();
}, MediaErr);
}
else if (navigator.mozGetUserMedia) {
navigator.mozGetUserMedia(videoObj, function (stream) {
video.src = window.URL.createObjectURL(stream);
video.play();
}, MediaErr);
}
else if (navigator.msGetUserMedia) {
navigator.msGetUserMedia(videoObj, function (stream) {
$(document).scrollTop($(window).height());
video.src = window.URL.createObjectURL(stream);
video.play();
}, MediaErr);
} else {
alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器');
return false;
}
if (flag) {
alert('为了获得更准确的测试结果,请尽量将二维码置于框中,然后进行拍摄、扫描。 请确保浏览器有权限使用摄像功能');
}
//这个是拍照按钮的事件,
$("#snap").click(function () { startPat(); }).show();
} catch (e) {
printHtml("浏览器不支持HTML5 CANVAS");
}
}, false);
//打印内容到页面
function printHtml(content) {
$(window.document.body).append(content + "<br/>");
}
//开始拍照
function startPat() {
setTimeout(function () {//防止调用过快
if (context) {
context.drawImage(video, 0, 0, 320, 320);
CatchCode();
}
}, 200);
}
//抓屏获取图像流,并上传到服务器
function CatchCode() {
if (canvas != null) {
//以下开始编 数据
var imgData = canvas.toDataURL();
//将图像转换为base64数据
var base64Data = imgData;//.substr(22); //在前端截取22位之后的字符串作为图像数据
//开始异步上
$.post("saveimg.php", { "img": base64Data }, function (result) {
printHtml("解析结果:" + result.data);
if (result.status == "success" && result.data != "") {
printHtml("解析结果成功!");
} else {
startPat();//如果没有解析出来则重新抓拍解析
}
}, "json");
}
}
</script>
<body>
<div id="support"></div>
<div id="contentHolder">
<video id="video" width="320" height="320" autoplay>
</video>
<canvas style="display:none; background-color:#F00;" id="canvas" width="320" height="320">
</canvas> <br />
<button id="snap" style="display:none; height:50px; width:120px;">开始扫描</button>
</div>
</body>
</html>
作者:艾孜尔江
转载或使用请务必标明出处!
__EOF__

本文作者:艾孜尔江
本文链接:https://www.cnblogs.com/ezhar/p/14919953.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/ezhar/p/14919953.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:艾孜尔江,转载请注明原文链接:https://www.cnblogs.com/ezhar/p/14919953.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-06-22 Windows10应知应会
2020-06-22 VSCode常用设置