h5调用手机摄像头踩坑
2024-03-12
422 字约 2 分钟
...一般业务也很少接触摄像头,有也是现成的工具库扫个二维码。难得用一次,记录下踩坑。
2.1. input
<input type="file" accept="image/*" capture="camera">
<input type="file" accept="video/*" capture="camcorder">
<input type="file" accept="audio/*" capture="microphone">
这个就不用多说了,缺点就是没办法自定义界面,它是调用的系统原生相机界面。
2.2. mediaDevices
由于我需要自定义界面,就像下面这样: 
所以我选择了这个方案,这个api使用起来其实很简单:
<video id="video" autoplay="autoplay" muted width="200px" height="200px"></video>
<button onclick="getMedia()">开启摄像头</button>
async getMedia() {
const constraints = {
video: {
height: 200,
wdith: 200,
},
audio: false
};
this.video = document.getElementById("video");
this.video.srcObject = await window.navigator.mediaDevices.getUserMedia(constraints);
this.video.play();
}
可以看到这个效果。
takePhoto() {
const video = document.getElementById("video");
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext('2d');
ctx.drawImage(this.video, 0, 0, 300, 300);
},
stopMedia() {
const stream = this.video.srcObject;
const tracks = stream.getTracks();
tracks.forEach(function (track) {
track.stop();
})
this.video.srcObject = null;
}
如果你复制我的代码,在localhost上肯定能运行,但是你想在手机上试试的时候就会发现很多问题。
3.1. 需要https
由于浏览器的安全设置,除了localhost和https连接,你都没办法获取到navigator.mediaDevices,打印出来是undefined。如果要在手机上测试,你要么用内网穿透代理一个https,要么部署在https域名的服务器上测试。
3.2. 设置前后摄像头
默认是使用user设备,也就是前摄像头,想要使用后摄像头也是有配置的,
async getMedia() {
let constraints = {
video: {
height: 200,
wdith: 200,
facingMode: { exact: "environment" },
},
audio: false
};
}
3.3. 设置显示区域大小
我的需求是铺满整个设备,所以我想当然的直接把video样式宽高设置成容器大小:
#video {
width: 100%;
height: 100%;
}
async getMedia() {
const pageSize = document.querySelector('.page').getBoundingClientRect()
let constraints = {
video: {
height: pageSize.height,
width: pageSize.width,
facingMode: { exact: "environment" },
},
audio: false
};
}
发现这个视频横着而且没有铺满屏幕。
通过输出video的信息可以看到,设备返回的视频流宽高是反的:

所以配置换一下就行了:
let constraints = {
video: {
height: pageSize.width,
width: pageSize.height,
},
};
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →移动端web2024-09-04
H5 实现拍照选景框效果利用
背景 在实际项目中,遇到了需要唤起手机摄像头拍照的需求,最开始是通过 的方式,可以直接唤起手机相机,但是用户拍照的方向各式各样,导致后续业务处理时,没有达到预期的效果。 基于此,产品同学期望能在用户拍照时给用户一个引导框(也就是平时我们在用第三方证件拍照时的取景框效果)。经过讨论,给出了两种解决方案,一种是通过我们自研,先尝试看一下效果,第二种是使用第三方的 SDK,仅使用他们的拍照功能。 本文档仅涉及第一种,即通过我们自研的方式,实现...
学习
移动端web2024-09-04
封装一个H5照相机组件(放大缩小、连拍、预览、手电筒,横竖屏拍摄)
项目上有个需求就是说移动端网页中的照相机要支持连拍功能。 要知道咱们一般网页中通过input标签调用出来的照相机都是拍完后需要进行点击确认操作,然后再重新点击拍照按钮调起照相机如此往复,这样的交互方式对于需要快速拍摄照片的场景来说效率确实太低了。 如果本机摄像头无法进行连拍操作的话只能通过直接调用媒体摄像头的方式看看能否实现,考虑到开源的组件UI和交互方式可能无法满足项目需要且也不太好扩展功能所以觉得自己封装一个。 使用到的技术 Nav...
学习
移动端web2024-09-03
H5移动端-解决点击输入框时页面自动放大的问题
问题 在移动端项目,我们常遇到的一个问题:用户点击输入框时,页面会不期望地发生自动缩放,这既打断了用户的输入流程,也影响了整体的用户体验。 我们的目标是优化这一行为,确保用户在点击输入框时,页面能够保持稳定,仅允许用户专注于内容的输入,从而提升产品的可用性和满意度。 解决前后效果对比 方案 针对移动端点击输入框导致页面自动缩放的问题,我们需要根据不同操作系统(主要是安卓与iOS)采取差异化的解决方案。 安卓:通常可以通过在HTML文档头...
学习
移动端web2024-03-12
探秘移动端网页调用摄像头的两种方式
简介: PC 端网页调用摄像头的场景想必大家并不陌生,打开一个网址,开启摄像头开始笔试/视频聊天/直播等。而在移动端网页调用摄像头的场景你见得多吗?我想答案应该是不多吧(在下见识浅薄)。 前言小叙 PC 端网页调用摄像头 的场景想必大家并不陌生,打开一个网址,开启摄像头开始笔试/视频聊天/直播等。 而在 移动端网页调用摄像头 的场景你见得多吗?我想答案应该是不多吧(在下见识浅薄)。 H5 相较于native app 一直被诟病的就有 调...
学习
移动端web2023-12-06
PC调试手机微信浏览器
此方案,可以调试一些仅可在微信客户端才能打开的网页,以及一些需要微信授权的网页,都可以用此方式进行真机调试,可快速分析和逆向 准备工具 一部手机 一台电脑 一条数据线 首先用数据线把手机与电脑连接 然后手机进入到开发者模式并且要是开启状态,具体进入方式,根据机型不同,进入方式不同,自行百度。 进入到开发者选项之后,开启USB调试模式。 然后在手机微信浏览器随便进入一个网站,例如: 再回到电脑浏览器输入: chrome内核的浏览器输入 c...
学习
AI2026-09-01
Deep Agents 01:何为 Agent Harness,以及如何开始
1、本篇任务:完成一份多步骤、带证据的技术调研 普通客服 Agent 的问题短、工具少、输出即时。技术调研或编码任务会持续很久,产生计划、搜索结果、文件和中间结论。Deep Agents 在 LangChain/LangGraph 之上预装规划、虚拟文件系统、上下文压缩和子 Agent,适合这类开放任务。 本课让 Agent 比较两种向量数据库,并交付一份可验证报告。 2、什么时候需要 Deep Agent 满足以下两项以上再考虑:任务...
学习
评论
请登录后发表评论
去登录