<template><div><h1>拍照</h1><div>说明:<dl><dd>navigator.mediaDevices.getUserMedia(constraints);</dd><div>constraints 是包含</div></dl></div><div><inputtype="button"title="开启摄像头"value="开启摄像头"@click="getMedia"class="media-box"/><inputtype="button"title="关闭摄像头"value="关闭摄像头"@click="closeMedia"class="media-box"/><inputtype="button"title="暂停摄像头"value="暂停摄像头"@click="pauseMedia"class="media-box"/><button id="snap" @click="takePhoto">拍照</button><button type="button" @click="downloadPhoto">下载照片</button></div><div><videoid="video"width="300px"height="300px"autoplay="autoplay"class="photo-area"></video><span><h2>下面是照片</h2><canvas id="canvas" width="300px" height="300px"></canvas>    </span>    </div></div>
</template><script>
export default {name: "Index",data() {return {photo: ""};},methods: {getMedia() {let self=this;let video = document.getElementById("video");navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;if (navigator.getUserMedia) {navigator.getUserMedia({video:{ width: 300, height: 300 }},function(stream) {console.log('stream:',stream)var track = stream.getTracks()[0];  // 通过这个关闭摄像头track .stop();let binaryData = [];binaryData.push(track);video.srcObject = stream;video.onloadedmetadata = function(e) {video.play();};},function(err) {alert(err);});}  this.setTimerSend();},getMedia1() {let constraints = {// 要开启 视频 video 可以简单的设置为 true ,也可以设置为对象/*** video: {*      width: 摄像头像素宽 1920*      height: 摄像头像素高 1080*      分辨率就是 1920*1080*      width: {*          max:  强制使用 max指定的宽*          min:  强制使用 min 指定的宽*      }*      height: {*          max:  强制使用 max指定的高*          min:  强制使用 min 指定的高*      }*      exact: 表示 max == min*      width: {ideal: 1920} ideal 表示应用最理想值作为像素*      height: {ideal: 1080}**      facingMode: "user" 使用前置摄像头--移动端需要设置这个属性*      facingMode: { exact: "environment" }  使用后置摄像头** }**/video: { width: 300, height: 300 },audio: true};//获得video摄像头区域let video = document.getElementById("video");video.style.display = "inline-block";//这里介绍新的方法,返回一个 Promise对象// 这个Promise对象返回成功后的回调函数带一个 MediaStream 对象作为其参数// then()是Promise对象里的方法// then()方法是异步执行,当then()前的方法执行完后再执行then()内部的程序// 避免数据没有获取到console.log(navigator.mediaDevices);let promise = navigator.mediaDevices.getUserMedia(constraints);promise.then(function(MediaStream) {console.log(`MediaStream: -->`);console.log(MediaStream);/*** mediaStream:{active: trueid: "k6zAanU7ynuXVvHwcfFLGmt5fX2E6OnLReVR"onactive: nullonaddtrack: nulloninactive: nullonremovetrack: null* }* * */video.srcObject = MediaStream;// 2种方式调用 load// 使用 addEventListener("loadedmetadata", (event)=> {...})// 使用 onloadedmetadata = (event)=> {...}// 都可以video.onloadedmetadata = event => {console.info(event);console.log("媒体加载完毕");video.play();};}).catch(function(err) {console.log(err.name + ": " + err.message);}); // 总是在最后检查错误// 获取到当前用户设备的 所有的媒体设备 【麦克风,摄像机,耳机设备】等navigator.mediaDevices.enumerateDevices().then(devices => {console.log(devices);devices.forEach(function(device) {console.log(device.kind +": " +device.label +" id = " +device.deviceId);});}).catch(err => {console.log(err.name + ": " + err.message);});navigator.mediaDevices.ondevicechange = () => {};},// 关闭摄像头closeMedia() {let video = (document.querySelector("#video").style.display ="none");},// 暂停pauseMedia() {let video = document.querySelector("#video");video.pause();},// 拍照takePhoto() {//获得Canvas对象let video = document.getElementById("video");let canvas = document.getElementById("canvas");let ctx = canvas.getContext("2d");ctx.drawImage(video, 0, 0, video.width, video.height);// 从 canvas上获取照片数据-- 将 canvas 转换成 base64this.photo = canvas.toDataURL("image/png")},downloadPhoto() {// 照片名字,用作下载,用时间戳代替let photoName = new Date().getTime()// 将 base64转换成 blob- 二进制数据let blob = this.base64ToBlob(this.photo)let aLink = document.createElement('a');// 自定义事件let evt = document.createEvent("HTMLEvents");// 事件初始化,定义怎么触发事件, 事件名 click, true阻止事件冒泡,阻止事件默认行为evt.initEvent("click", true, true);aLink.download = photoName;aLink.href = window.URL.createObjectURL(blob);// 触发事件aLink.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));//兼容火狐},base64ToBlob(base64) {// 照片数据格式是  data:image/png;base64,base64照片数据let parts = base64.split(";base64,");console.log(parts)// 照片类型// parts[0]  "data:image/png"// parts[1]  照片的base64字符串let contentType = parts[0].split(":")[1]  // image/pnglet raw = window.atob(parts[1])let rawLength = raw.length;let uInt8Array = new Uint8Array(rawLength)for(let i=0; i<rawLength; i++) {// 将字符串每个字符全部转换成 Unicode 编码uInt8Array[i] = raw.charCodeAt(i)}// Blob 第一个参数接受的是一个数组, 参数2的type是一个 MIME类型// 返回一个 二进制数据return new Blob([uInt8Array], {type: contentType})}}
};
</script><style lang="scss" scoped>
.media-box {border: 1px solid #ff0000;
}
.photo-area {border: 2px solid yellow;
}
</style>

vue获取摄像头视频、拍照相关推荐

  1. android获取摄像头视频帧数据

    1.思路 一.通过android的Camera.setPreviewCallback(PreviewCallback cb)监听回调. 二.此回调函数public void onPreviewFram ...

  2. opencv获取外接摄像头_opencv获取摄像头视频

    结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include "stdafx.h" #include # ...

  3. web浏览器获取摄像头并拍照

    浏览器兼容性尚可 desktop mobile Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera An ...

  4. 利用Flash获取摄像头视频进行动态捕捉

    一.引言 摄像头游戏是随着摄像头的普及和图形图像技术的不断发展而出现的.它摆脱了鼠标键盘的限制,给游戏者带来全新的游戏体验,能够实现许多传统游戏无法实现的游戏效果.它通过摄像头将玩家投影到游戏中,由玩 ...

  5. Android不显示Camera视频获取摄像头视频帧数据

    1.在Activity界面代码中: private var mCamera: Camera? = null private val mWidth = GwApplication.DEFAULT_REM ...

  6. js获取摄像头权限实现拍照功能

    首先说一下js打开摄像头的流程: 使用getUserMedia打开摄像头然后将获取到的流媒体转成url放在video标签中的src中: 使用canvas的drawImage方法将video的内容绘至c ...

  7. 挑战一个人搭建一套完整直播系统4: 实现网络摄像头视频传输

    摄像头采购的是海康卫视的网络摄像头: 支持通过rtsp传输视频流,网络摄像头的配置如下: ffmpeg可以直接通过rtsp获取摄像头视频数据并推流到我们之前搭建好的Nginx服务,具体指令如下: ff ...

  8. js调用pc摄像头实现拍照、录视频等,新版Chrome无访问http页面无法打开麦克风、摄像头

    js调用pc摄像头实现拍照.录视频等,新版Chrome无访问http页面无法打开麦克风.摄像头 新版Chrome配置 vue环境下的前端 function部分 ##由于没有https环境,只有http ...

  9. vue调用本地摄像头实现拍照

    前言: vue调用本地摄像头实现拍照功能,由于调用摄像头有使用权限,只能在本地运行,线上需用https域名才可以使用. 实现效果: 1.摄像头效果: 2.拍照效果: 实现代码: <templat ...

最新文章

  1. 如何设计一个支撑数亿用户的系统
  2. 单链表-两个线性表的合并(不破坏原链表+尾插法)
  3. 【Python】监控视频中运动目标检测的代码实现及效果展示
  4. zip伪加密做法及原理
  5. Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
  6. 【渝粤题库】陕西师范大学291003综合英语(三)作业(高起专、高起本)
  7. padding 后尺寸变化 设置_padding margin border 和元素大小
  8. oracle查询ora03114,求教:ora-03114错误从哪里排查?
  9. 【英语学习】【WOTD】purview 释义/词源/示例
  10. epoll示例程序——服务端
  11. 线性回归(二)---多元线性回归
  12. 光伏机器人最前线_高工机器人走进光伏:数字化车间未来可期
  13. qt中如何刷新一下屏幕_感情维护:如何在恋爱关系中分开一下,然后更坚强地回来...
  14. spss26没有典型相关性分析_【spss典型相关分析】数学建模__SPSS_典型相关分析
  15. 实验五|Python 企业获利能力分析
  16. 【96】太空射击游戏_笔记
  17. DS18B20数字温度计使用(转)
  18. logstash日志收集走过的坑
  19. C++很难吗?到底有多难?
  20. oracle中spool卸数,数据卸载--spool的使用

热门文章

  1. css3动画作品,CSS3 动画
  2. centos镜像资源和虚拟机详细安装教程
  3. TypeScript入门基础
  4. Win11 22H2(KB5017321)更新失败显示下载错误0x800F0806修复方法
  5. linux查看有多少内核,linux上查看cpu和内核的个数
  6. airflow 源码调试之源码运行(一)
  7. 用Rico LiveGrid小部件创建数据集导航
  8. 2022-2028全球与中国问答平台市场现状及未来发展趋势
  9. linux服务器状态查看命令,Linux服务器操作系统查看命令
  10. 成都盛迈坤电商:直通车没有曝光的原因