包含Javascript的HTML静态页面调取本机摄像头

article/2025/9/4 9:34:06

在实际业务开发中,需要在带有摄像头的工作机上拍摄施工现场工作过程的图片,然后上传到服务器备存。

这便需要编写可以运行在浏览器上的代码,并在代码中实现Javascript调取摄像头、截取帧保存为图片的功能。

为了使用户更快掌握JS调取摄像头的实现机制,现将其与服务器端连接的代码剥离,仅展示包念JavaScript调用摄像头的HTML代码。

JsInvokeVideo.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>摄像头访问示例</title><style>body {font-family: Arial, sans-serif;text-align: center;margin: 20px;}.container {max-width: 800px;margin: 0 auto;}video {width: 100%;max-width: 640px;background-color: #000;border-radius: 8px;}canvas {display: none;}.controls {margin-top: 20px;}button {padding: 10px 20px;margin: 5px;font-size: 16px;cursor: pointer;background-color: #4CAF50;color: white;border: none;border-radius: 4px;}button:hover {background-color: #45a049;}#captureButton {background-color: #f44336;}#captureButton:hover {background-color: #d32f2f;}#downloadLink {display: none;margin-top: 10px;text-decoration: none;color: #2196F3;}.captured-image {margin-top: 20px;max-width: 100%;border-radius: 8px;}</style>
</head>
<body><div class="container"><h1>摄像头访问示例</h1><video id="videoElement" autoplay></video><canvas id="canvasElement"></canvas><div class="controls"><button id="startButton">启动摄像头</button><button id="stopButton" disabled>停止摄像头</button><button id="captureButton" disabled>拍照</button><a id="downloadLink" href="#" download="captured-image.jpg">下载图片</a></div><img id="capturedImage" class="captured-image" src="" alt="拍摄的照片"></div><script>// 获取DOM元素const videoElement = document.getElementById('videoElement');const canvasElement = document.getElementById('canvasElement');const startButton = document.getElementById('startButton');const stopButton = document.getElementById('stopButton');const captureButton = document.getElementById('captureButton');const downloadLink = document.getElementById('downloadLink');const capturedImage = document.getElementById('capturedImage');// 存储摄像头流let stream = null;// 启动摄像头startButton.addEventListener('click', async () => {try {// 请求媒体设备stream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 480 },audio: false});// 将流连接到视频元素videoElement.srcObject = stream;// 更新按钮状态startButton.disabled = true;stopButton.disabled = false;captureButton.disabled = false;console.log('摄像头已启动');} catch (error) {console.error('访问摄像头时出错:', error);alert('无法访问摄像头,请确保您已授予权限。');}});// 停止摄像头stopButton.addEventListener('click', () => {if (stream) {// 停止所有轨道stream.getTracks().forEach(track => {track.stop();});// 清除视频源videoElement.srcObject = null;// 更新按钮状态startButton.disabled = false;stopButton.disabled = true;captureButton.disabled = true;console.log('摄像头已停止');}});// 拍照captureButton.addEventListener('click', () => {const context = canvasElement.getContext('2d');// 设置canvas尺寸与视频相同canvasElement.width = videoElement.videoWidth;canvasElement.height = videoElement.videoHeight;// 将当前视频帧绘制到canvascontext.drawImage(videoElement, 0, 0, canvasElement.width, canvasElement.height);// 显示拍摄的图片const imageDataURL = canvasElement.toDataURL('image/jpeg');capturedImage.src = imageDataURL;// 启用下载链接downloadLink.href = imageDataURL;downloadLink.style.display = 'inline-block';console.log('照片已拍摄');});// 页面关闭时停止摄像头window.addEventListener('beforeunload', () => {if (stream) {stream.getTracks().forEach(track => {track.stop();});}});</script>
</body>
</html>

无须配置服务器,将上述代码保存为JsInvokeVideo.html,双击运行即可。

注意:编辑该html文件时一定要保存编码为UTF-8,否则运行时会显示乱码,如下所示:

用文本文件打开该JsInvokeVideo.html文件,点击“另存为”,选择编码为“UTF-8”,重新运行会显示正常:


http://www.hkcw.cn/article/PMFpVQBLki.shtml

相关文章

2023年6月第三套第二篇

找和脑子有关系的rather than 不是的意思&#xff0c;不用看 instead表示递进的解释 even when即使不重要&#xff0c;看前方主句 d选项是even when和前方主句的杂糅&#xff0c;往往是错的 instead of 而不是 这道题&#xff0c;有的人觉得避免模仿这时候你会笑&#xff0c;所…

Redis的大Key问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Redis的大Key问题如何解决&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis的大Key问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis中的“大Key”问题是指某个键的值占用了过多…

magic-api配置Git插件教程

一、配置gitee.com 1&#xff0c;生成rsa密钥&#xff0c;在你的电脑右键使用管理员身份运行&#xff08;命令提示符&#xff09;&#xff0c;执行下面命令 ssh-keygen -t rsa -b 2048 -m PEM一直按回车键&#xff0c;不需要输入内容 找到 你电脑中的~/.ssh/id_rsa.pub 文件…

Virtuoso中对GDS文件进行工艺库转换的方法

如果要对相同工艺节点下进行性能评估&#xff0c;可以尝试将一个厂商的GDS文件转换到另一个厂商&#xff0c;不过要注意的是不同厂商&#xff08;比如SMIC和TSMC&#xff09;之间的DRC规则&#xff0c;尽量采用两个DRC中的约束较为紧张的厂商进行设计&#xff0c;以免转换到另外…

【二】9.关于设备树简介

1.什么是设备树&#xff1a; &#xff08;DTS&#xff09;采用树形结构描述扳级设备&#xff0c;也就是开发板上的设备信息&#xff0c;每个设备都是一个节点。 一个SOC可以做出很多不同的板子&#xff0c;这些不同的板子肯定是有共同的信息&#xff0c;将这些共同的信息提取出…

VSCode远程开发-本地SSH隧道保存即时修改

工作环境是一个网站团队几人同时在改&#xff0c;为了减少冲突&#xff0c;我们选择在自己公司服务器上先部署一版线上通用&#xff0c;再连接到不同的本地&#xff0c;这样我们团队可以在线上即时看到他人修改的结果&#xff0c;不用频繁拉取提交推送代码 在线上服务器建一个…

Embedded IDE下载及调试

安装cortex_debug插件 我这边用jlink烧录&#xff0c;其他的根据你自己的来 jlink路径在左下角齿轮设置里 设置位置&#xff1a; 芯片名称配置的都是自动生成的&#xff0c;在eide.json的这里改为你jflash芯片包的设置 调试里也会自动生成一个cortex_debug的调试选项 点旁边的…

lua注意事项

感觉是lua的一大坑啊&#xff0c;它还不如函数内部就局部变量呢 注意函数等内部&#xff0c;全部给加上local得了

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…

长安链起链调用合约时docker ps没有容器的原因

在调用这个命令的时候&#xff0c;发现并没有出现官方预期的合约容器&#xff0c;这是因为我们在起链的时候没有选择用docker的虚拟环境&#xff0c;实际上这不影响后续的调用&#xff0c;如果想要达到官方的效果那么你只需要在起链的时候输入yes即可&#xff0c;如图三所示

表中如何插入数据!扩展技能边界

insert语句向表中添加行。认识命令就行&#xff0c;使用时可以问AI帮忙写。 一.按顺序插入行 向上次新建的天气表&#xff0c;插入行。 insert into weather values (1,北京, 1, 37, 0.55, 2025-05-12); --按顺序依次写 insert into weather values (2,上海, 10, 41, …

三轴云台之抗扰动技术篇

三轴云台的抗扰动技术是保障其在复杂动态环境下实现稳定拍摄的核心&#xff0c;其技术体系涵盖机械结构优化、传感器融合算法、控制策略设计及动态补偿机制等多个层面。 一、抗扰动技术核心原理 多轴解耦与独立控制 俯仰轴&#xff08;Pitch&#xff09;、横滚轴&#xff08…

财管4-债务资本成本普通股资本成本的估计

1.债务资本成本 1) 未来成本 2) 期望成本 3) 长期债务成本 2.税前债务资本成本估计 2.1 各种方法 适用方法适用条件到期收益率公司目前有上市发行的长期债券可比公司 虽然没有上市债券&#xff0c;但可以找到一个拥有可交易债券的可比公司作为参照物&#xff1b;使…

【25-cv-05935】Keith律所代理(绿色巴士图)版权维权案

绿色巴士版权图 案件号&#xff1a;25-cv-05935 立案时间&#xff1a;2025年5月28日 原告&#xff1a;Alena Pavluchenko d/b/a Ellen Paul Art 代理律所&#xff1a;Keith 原告介绍 原告是科德角海滨的一名艺术家&#xff0c;擅长以水彩、书法和浮木雕刻记录生活。她通过…

登山第二十三梯:有序点云平面快速分割——35Hz帧速前进

文章目录 一 摘要 二 资源 三 内容 一 摘要 3D 点云中的实时平面提取对于许多机器人应用至关重要。作者提出了一种新颖的算法&#xff0c;用于在从 Kinect 传感器等设备获得的有组织的点云中实时可靠地检测多个平面。通过在图像空间中将这样的点云均匀地划分为不重叠的点组&…

【聚焦国产8K全画幅摄像机应用】多图预警!

聚焦国产8K全画幅摄像机应用实战图&#xff1a; 博冠8K全画幅摄像机B1应用于2023中央广播电视总台春晚拍摄现场 博冠8K全画幅摄像机B1应用于2023中央广播电视总台春晚拍摄现场 ​​​​ 博冠8K全画幅摄像机B1拍摄2022北京冬奥会 博冠8K全画幅摄像机B1在某电视台节目制作现场进行…

专题|LSTM-XGBoost,ARMA-LSTM,LDA-LSTM黄金比特币价格混合预测,蔬菜包发放时空协同调配,知乎综艺评论情感时序洞察

全文链接&#xff1a;https://tecdat.cn/?p42305 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Jingwen Luo&#xff0c;Yuying Liu&#xff0c;Yiyuan Jiang 在数字化浪潮席卷各行各业的当下&#xff0c;数据已成为驱动决策的核心要素。作为数据科学工作者…

Vue 组件 - 指令

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令 目录 指令写法 自定义指令 简单封装指令 指令传递字符串 update事件 指令应用 指令实现轮播 指令函数简写 指令函数列表 bind inserted update componentUpdated unbind Vue3指令轮播 nextick 总结 指…

在Mathematica中求解带阻尼的波方程

考察偏微分方程 和初边值条件 这里主要示意一下&#xff0c;这个方程如何用Mathematica来求解以及在使用不同解法的时候&#xff0c;会遇到什么问题。 方法一&#xff1a;不额外附加边界条件 ClearAll[u, x, t, a, b, c, w, n];c 1; n 1; a 1; b 1; w 1;pde {D[u[t, x]…

Linux目录结构与命令基础与ls命令

目录结构 linux的目录结构是一个树形结构&#xff0c;只有一个根目录&#xff1a;/&#xff0c;所有文件都在他下面。 而win有多个根目录&#xff0c;每一个盘符都是一个根目录 在linux系统中&#xff0c;路径的层级关系使用“/”表示。而一般来说&#xff0c;开头的 /表示的…