首先说一下js打开摄像头的流程:

  1. 使用getUserMedia打开摄像头然后将获取到的流媒体转成url放在video标签中的src中;
  2. 使用canvas的drawImage方法将video的内容绘至canvas中,这样就形成了截图的效果;
  3. 使用stream.getTracks()[0].stop()关闭摄像头。

1.开启摄像头

开启摄像头主要有两种方法,一个是旧方法window.navigator.getUserMedia()方法,还有一个就是新方法navigator.mediaDevices.getUserMedia()。旧方法的使用如下:

btn1.addEventListener("click", function (event) {if ("getUserMedia" in window.navigator) {window.navigator.getUserMedia({video: true,audio: false}, function (stream) {v1.srcObject = stream;v1.play();}, function (err) {console.error("获取摄像头视频错误");})}});

其中window.navigator.getUserMedia()方法的参数有三个。

  1. 第一个参数是一个对象,用于选择是否使用视频(video)和audio(audio)。
  2. 第二个参数是成功的回调,其中带一个参数(stream),在旧版本中可以直接通过调用MediaStream.stop() 来关闭摄像头,不过在新版之中已废弃。需要使用MediaStream.getTracks()[index].stop() 来关闭相应的Track 。
  3. 第三个参数是失败的回调,他有一个参数err用于接收错误,可以在控制台打印出来。

新方法的getUserMedia 位于navigator.mediaDevices对象下面,使用方法如下:

  btn1.addEventListener("click", function () {if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {navigator.mediaDevices.getUserMedia({video: true,Audio: true}).then(function (stream) {mediaStreamTrack =  stream.getTracks()[0];btn2.addEventListener("click", function () {mediaStreamTrack.stop();}, false);video.srcObject = stream;video.play();}).catch(function (err) {console.log(err);})}});

这个新方法返回的是一个Promise对象,可以使用then和catch表示成功与失败的回调。其中的btn2的监听事件是关闭摄像头的,在下文会说明。
这里我想说的是第一次用这个新方法的时候有点问题,我准备用URL.createObjectURL()这个方法将流媒体转成一个地址然后放在video标签的src中,但是浏览器给我来了这么一下:

我就查了一下MDN发现他给出了下面的解释:

感兴趣的可以去这里看看URL.createObjectURL()
解决的方法如下:
原先的代码:

video.src = URL.createObjectURL(stream);

更改成下面的代码:

video.srcObject = stream;

兼容版本如下:

try {
this.srcObject = stream;} catch (error) {
this.src = window.URL.createObjectURL(stream);}

这里的解决方案是我查到的,具体的相关解释可以看下该博主的博客

2.使用canvas截图

代码如下:

var photo = document.querySelector("#photo");
var ctx = photo.getContext("2d");
btn3.addEventListener("click", function () {ctx.drawImage(video, 0, 0, 300, 300);}, false)

3.关闭摄像头

在旧版本中可以直接使用stream.stop()来关闭摄像头,不过现在好像已经不行了所以我直接跳过使用新方法stream.getTracks()来关闭摄像头。

var mediaStreamTrack =  stream.getTracks()[0];btn2.addEventListener("click", function () {mediaStreamTrack.stop();}, false);

这里需要注意的是返回的stream.getTracks()返回的Tracks数组是倒序排列的,例如video在第一个audio在第二个,那么stream.getTracks()[1]就是video。不过我在本例中只获取到了video,我也不知道为啥…所以只能用下标0。

js获取摄像头权限实现拍照功能相关推荐

  1. 前端获取电脑摄像头权限并拍照进行人脸识别

    为什么要做这个呢? 不同用户具有不同的权限 如果管理员用户被别人知晓了怎么办? 为了解决该用户 账号密码泄露导致的误操作. 前端实现思路是什么呢? 前端思想是获取摄像头权限 通过canvas 获取ba ...

  2. Atititjs h5调用摄像头视频聊天 拍照功能 相机功能 录像attilax总结

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Atit ...

  3. 微信小程序开发(3) - 微信小程序调用摄像头静默隐藏拍照功能实现方式

    微信小程序最近非常火热,小编最近做了一个微信小程序开发新项目,使用小程序开发考试系统,在使用App参加考试的时候调用摄像头抓拍用户是否作弊,在开发过程中遇到点问题,下面小编把问题描述和解决方法分享给大 ...

  4. Ubuntu系统下OpenCV使用实例(虚拟机获取摄像头权限)

    文章目录 一.OpenCV图片特效实例(实现原图中心放大两倍) 二.OpenCV视频使用实例 1.虚拟机获取摄像头权限 2.播放视频 3.录制视频 Ubuntu下OpenCV初步学习至此结束!! 一. ...

  5. Android webview加载页面获取摄像头权限实践(Kotlin)

    场景介绍: Android app中的webview加载含摄像头相关逻辑的H5页面,进行赋权的操作 H5页面调取摄像头逻辑: vue编写 <template><div>< ...

  6. js获取摄像头中的视频流并上传到后台

    今天研究了下js获取摄像头中的视频流,全网搜索相关的文章,终于上天不负有心人.以下是原文代码: index.html: <!DOCTYPE html> <html><he ...

  7. Android6.0动态获取摄像头权限(举一反三)

    6.0系统可以动态的获取系统的权限API>22 例如摄像头 举一反三写一个动态获取摄像头的方法,其他的权限也可以稍微修改使用. 在调用摄像头的地方进行判断,系统的版本 Build.VERSION ...

  8. HarmonyOS应用开发JSAPI—js获取相册权限调用相册图片

    前置: Api:8 语言:js开发 需要权限: ohos.permission.READ_USER_STORAGE ohos.permission.WRITE_USER_STORAGE 开始: 1.创 ...

  9. Unity获取摄像头权限

    直接上代码,unity帮我们内置了功能. using System.Collections; using UnityEngine; using UnityEngine.UI;public class ...

最新文章

  1. 大二上学数据结构和操作系统_毕业后的工作比上学要重要得多。 这是数据。...
  2. Swoole笔记(五)
  3. 运行时修改数据库连接字符串(ConnectionString)
  4. K8S 利用Rinetd实现Service负载均衡
  5. 正确处理kafka多线程消费的姿势
  6. robot:循环遍历数据库查询结果是否满足要求
  7. 多个页面同时跳转到一个页面,然后返回到上级页面
  8. PHP随笔---简述var_dump()、print_r()、echo()
  9. linux nginx jsp,将nginx注册成linux的服务(service)
  10. java api练习_Java接口练习
  11. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径...
  12. Qt网络编程实现TCP通信
  13. 播布客全部视频教程汇总
  14. Unity射线检测指定Layer的物体
  15. vue综合项目——悦听音乐播放器
  16. 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
  17. git 记住账号密码、忽略部分文件、合并分支、将远程分支拉取到本地
  18. bios error 装系统acpi_WIN10重装系统提示错误ACPI?处理重装系统bios acpi错误
  19. kibana服务器性能要求,kibana 性能监控 apm
  20. 人生算法第一天心得总结(A)九段进阶(3-6)

热门文章

  1. JAVA IO操作笔记
  2. 你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。 抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟)
  3. python计算召回率_机器学习之分类:精确率和召回率
  4. 南邮通达计算机组成,计算机组成习题课(南邮)
  5. remote: pingfan443: Incorrect username or password (access token) fatal: Authentication failed for
  6. 网络推广方式有哪些,网络推广哪个平台好?
  7. Direct3D 12 尝鲜: 基本呈现
  8. DirectX11 Direct3D初始化
  9. linux系统下破解 Idea的步骤
  10. blackjack算法java_[CareerCup] 8.1 Implement Blackjack 实现21点纸牌