Electron应用中实现调用外接摄像头并拍照上传

背景

基于Electron实现的pc端智能验机应用,近期迭代了一个新的功能,需求是通过电脑外接摄像头对手机屏幕进行拍照,拍照后需将照片上传至服务端进行屏幕信息比对,确定被检测屏幕是否为原厂屏。

需求分析

根据上面的需求,分析大概要以下几个步骤。

1.先实现将摄像头的画面实时展示在页面视频采集区域中;
2.将摄像头中的视频画面采集一帧成图片并回显;
3.将生成的图片上传至CDN拿到图片链接;
4.将图片链接上传到后端接口做处理;

确定了需要以上四个步骤后,接下来一步一步实现。

实现

视频采集

由于 Electron 内置了 Chromium 浏览器,该浏览器对各项前端标准都支持得非常好,所以基于 Electron 开发应用不会遇到浏览器兼容性问题。几乎可以在 Electron 中使用所有 HTML5CSS3ES6 标准中定义的 API

所以基于WebRTC提供的API即可获取到摄像头的视频流。

MediaDevices.getUserMedia()

代码如下:

methods: {getUserMedia() {/* 可同时开启video(摄像头)和audio(麦克风) 这里只请求摄像头,所以只设置video为true */navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) {/* 使用这个 stream 传递到成功回调中 */this.success(stream)}).catch(function(err) {/* 处理 error 信息 */this.error(error)});}
} 

MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D 转换器等等),也可能是其它轨道类型。

它返回一个 Promise 对象,成功后会resolve回调一个 MediaStream 对象。若找不到满足请求参数的媒体类型,promisereject回调一个NotFoundError

现在已经成功获取到视频流,接下来就是将视频流回显到页面。 这里使用video标签完成,代码如下:

<template><div class="video-page"><div class="video-content"><video ref="video" class="video-item"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Electron 调用摄像头拍照可以通过使用 `screen` 和 `camera` 模块来实现。下面是一个简单的示例代码,演示了如何使用 Electron 调用摄像头拍照: 1. 首先,确保你已经安装了 Electron。 2. 创建一个新的 Electron 项目,可以使用 `electron-app cd my-electron-app npm init -y npm install electron@latest --save-dev ``` 3. 在项目根目录下创建一个名为 `main.js` 的文件,并输入以下代码: ```javascript const { app, BrowserWindow } = require('electron') const fs = require('fs') function createWindow () { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false } }) win.loadFile('index.html') } app.whenReady().then(createWindow) ``` 4. 在 `package.json` 文件添加一个名为 `index.html` 的入口文件,用于展示摄像头拍照的界面。可以使用以下代码创建 `index.html` 文件: ```html <!DOCTYPE html> <html> <body> <video id="video" width="640" height="480" autoplay></video> <button id="capture">拍照</button> <script src="main.js"></script> </body> </html> ``` 5. 在 `main.js` 文件添加以下代码,用于调用摄像头拍照: ```javascript const { screen, camera } = require('electron') // 引入摄像头模块 const { ipcMain } = require('electron') // 引入 ipcMain 模块用于处理事件 const { dialog } = require('electron').remote // 使用远程模块的对话框 API 弹出拍照界面 const fs = require('fs') // 使用 Node.js 的文件系统模块来保存照片文件 const htmlFile = './index.html' // 设置前端入口文件的路径,此处需要保证与前端页面路径一致 const videoElement = document.getElementById('video') // 获取视频元素对象,用于显示摄像头画面 const captureButton = document.getElementById('capture') // 获取拍照按钮对象,用于触发拍照事件 const videoStream = screen.getPrimaryDisplay().getDisplayMedia({ video: true }) // 获取主屏幕的摄像头流对象,返回一个 Promise 对象,等待 Promise 解析完成即可获取到摄像头流对象,并赋值给 videoStream 变量 const streamPromise = new Promise((resolve, reject) => { // 创建一个 Promise 对象,用于等待摄像头流对象解析完成,并在解析失败时抛出错误信息并终止程序执行 videoStream.on('error', (error) => { // 当摄像头流对象出现错误时触发此事件,并抛出错误信息并终止程序执行 reject(error) }) resolve(videoStream) // 当摄像头流对象解析成功时触发此事件,将摄像头流对象赋值给 resolve() 方法返回的参数值,即 Promise 的 resolve() 方法返回的参数值赋值给 videoStream 变量即可完成 Promise 的解析操作,此时可以正常使用摄像头流对象进行后续操作了。 }) camera.getMedia({ video: true }).then((stream) => { // 使用摄像头模块的 getMedia 方法获取摄像头流对象,并返回一个 Promise 对象,等待 Promise 解析完成即可获取到摄像头流对象,并赋值给 stream 变量使用,此处需要使用 Promise 的 then() 方法来处理 Promise 的解析结果并使用 stream 变量进行后续操作。当获取到摄像头流对象后,可以使用 stream.on() 方法来监听视频播放的回调函数以触发相应的事件和功能实现。在 stream 上注册回调函数可以使用回调函数的 eventId() 方法获取到具体的回调事件和函数指针变量进行注册回调函数的操作。可以在具体实现时结合调用相机进行拍照、保存照片、传输等操作实现相关的功能实现需求。上述代码使用 htmlElement.on() 方法监听视频播放事件触发相应的事件和功能实现需求。具体实现可以结合使用相关的 API 和库来实现相应的功能需求。当视频播放完毕时可以使用 stream.getVideoTracks().get(0).getTracks().stop() 方法来停止视频播放并释放资源。上述代码使用了 WebRTC 技术来处理视频流的播放和传递。使用时需要根据具体的 API 和功能实现需求来进行调用和处理。以上就是使用 Electron 和相关模块实现调用摄像头拍照的基本步骤和

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值