【译】如何使用Vue捕获网络摄像头视频
几个月前,我一直关注着比特币的爆发并且在GDAX网站上注册账号。在注册验证的过程中,网站提示要通过计算机的网络摄像头提交我自己的一张照片作为照片ID。这是一个很酷的做法,让我思考一个问题:在网络浏览器上集成网络摄像头使用需要怎么做?
事实上,有一些HTML5的API可用于通过JavaScript与网络摄像头进行交互。
下面,我们来看下如何创建一个VueJS的Web应用,在Web浏览器上通过网络摄像头直接捕获。
使用Vue CLI创建Vue项目
为了使项目更易于的理解,我们将从头开始搭建项目。为方便起见,我们使用Vue CLI脚手架来构建项目。(安装Vue CLI 详见官网)
安装好CLI之后,执行以下命令:
vue init webpack camera-project
在脚手架处理的过程中会提示一些问题。对于这个特别的项目,如果你选择了包含编译器和运行时或只有运行时,都无关重要。我们不会创建多个组件,所以路由对于这个项目不是必要的。
此时,我们可以开始开发应用了。
为图像捕获编写应用逻辑和接口
对于这个特定的项目,我们有一些目标。我们希望能够把网络摄像头流传输到UI并且按需捕获帧。下面是一张我们所希望实现的功能的截图。
每次我们捕获一张图片,将会加到下面小的列表中。如果有需要,我们可以通过HTTP API将捕获图片发送到数据库。
所以,我们要怎么实现这些项目的目标?
打开项目的src/App.vue文件,加入以下内容开始:
<template>
<div id="app">
</div>
</template>
<script>
export default {
name: 'app',
data() {
return {
video: {},
canvas: {},
captures: []
}
},
mounted() { },
methods: { }
}
</script>
<style>
body: {
background-color: #F0F0F0;
}
#app {
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
#video {
background-color: #000000;
}
#canvas {
display: none;
}
li {
display: inline;
padding: 5px;
}
</style>
该template块暂时先保留为空。相反,我们先看看script标签部分的内容。
我们需要初始化一些用于UI的变量,这可以通过data方法完成。video变量将绑定到一个video元素,canvas变量将绑定到一个canvas元素,而captures数组则用于存储已捕获的图像列表。
mouted方法将会在应用加载完使触发调用。此方法内容如下:
mounted() {
this.video = this.$refs.video;
if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {
this.video.src = window.URL.createObjectURL(stream);
this.video.play();
});
}
},
我们需要和UI中的HTML元素进行交互,可以使用Vue.js的refs,而不是试图直接访问DOM。你将会很快看到,但HTML元素将会有ref属性,值为video。
一旦我们获取了元素的引用,就可以检测来确保该值是否支持媒体捕获。如果支持媒体捕获,我们将可以从网络摄像头获取流并把流加载到HTML Video元素中。
事实上,以上代码的灵感来自David Walsh的教程,使用HTML5控制摄像头和视频,我只是用refs和Vue改写了。
下面来到我们的methods中,将会有一个capture方法,代码如下:
methods: {
capture() {
this.canvas = this.$refs.canvas;
var context = this.canvas.getContext("2d").drawImage(this.video, 0, 0, 640, 480);
this.captures.push(canvas.toDataURL("image/png"));
}
}
同样地,我们将refs用于HTML元素,一旦我们获得了canvas元素的引用,就可以获得Video元素的图像,将其转换成一张图片,并且放到captures数组中。
那么,与JavaScript逻辑对应的HTML是怎么样的?
在项目的src/App.vue文件中,我们来看下template块的内容:
<template>
<div id="app">
<div><video ref="video" id="video" width="640" height="480" autoplay></video></div>
<div><button id="snap" v-on:click="capture()">Snap Photo</button></div>
<canvas ref="canvas" id="canvas" width="640" height="480"></canvas>
<ul>
<li v-for="c in captures">
<img v-bind:src="c" height="50" />
</li>
</ul>
</div>
</template>
还记得之前提到过的refs吗?这就是分配的地方
<div>
<video ref="video" id="video" width="640" height="480" autoplay></video>
</div>
video标签有ref="video",同样canvas标签也类似。
当按钮按下时,该capture方法会调用。captures变量循环遍历,每张图片渲染到屏幕上。
还可以,对吧?
结论
刚刚了解了如何使用Vue.js Web应用程序中的Web浏览器从Web摄像头捕获图像。大多数繁重的工作都是通过HTML5 JavaScript API完成的,但Vue.js使得事情变得非常简单。
在这篇特定的文章中使用了一些重要的Vue.js概念。refHTML元素的属性允许我们从JavaScript访问它们。通过v-bind:src在标签上使用,我们能够显示我们捕获的图像。
原文链接
https://x-team.com/blog/webcam-capture-vue/
Review
以上是简单翻译的一篇文件,主要是使用HTML5API与摄像头进行交互,本篇文件内容相对简单,只是大概了解到摄像头捕获图像转成图片的功能。目前在Web开发场景,一般会使用到拍照上传等功能,对于视频人脸识别等场景也会有用到,所以搜到这篇文章做了大概了解。
【译】如何使用Vue捕获网络摄像头视频的更多相关文章
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- ffplay 播放网络摄像头视频
shell脚本如下,无须加port ffplay rtsp://cameral_ip
- 在Jetson TX2上捕获、显示摄像头视频
参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...
- 基于opencv网络摄像头在ubuntu下的视频获取
基于opencv网络摄像头在ubuntu下的视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译运行步骤 安装编译opencv-2.3 参 ...
- 在 HTML5 中捕获音频和视频
简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...
- 在Windows IoT上使用网络摄像头
在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用.但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能. 关于摄像头的寻找和拍摄 ...
- TVideoGrabber如何将网络摄像头影像实时发布到网络
在TVideoGrabber中如何将网络摄像头影像实时发布到网络?如何设置正在运行TVideoGrabber的一台电脑,同时通过另一台电脑在网络中实时的观看在线视频呢? 在这里称发送视频流的电脑为“m ...
- 网络语音视频技术浅议 Visual Studio 2010(转)
我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...
随机推荐
- Python os.chdir() 方法
概述 os.chdir() 方法用于改变当前工作目录到指定的路径. 语法 chdir()方法语法格式如下: os.chdir(path) 参数 path -- 要切换到的新路径. 返回值 如果允许访问 ...
- <TCP/IP>链路层小结
图片和部分内容转载自Chang Zhao 这章大致介绍了以太网,以太网帧的格式,网桥和交换机,无线局域网(Wi-Fi),点到点协议,MTU(最大传输单元)的知识点,所谓链路,在此可以解释为 IP数 ...
- AngularJs 刷新页面
第一种: AngularJs 刷新页面可采用下面的方式:首先先在控制器中注册$window,然后定义函数$scope.reloadRoute,在需要刷新页面的地方调用函数$scope.reloadRo ...
- wireshark找(检测)不到(捕获)网卡的解决办法
1 前言 有时候打开wireshark,会提示找不到可用网卡,此时是因为NetGroup Packet Filter Driver 服务没有开启. 环境:笔记本 系统:Win10 网络:WIFI 2 ...
- 在内网使用Gradle构建Android Studio项目
在Android Studio项目中,默认的远程仓库为jcenter,如果在项目引用了一些类库,Gradle构建程序的时候会将这些依赖类库从jcenter网站下载到本地,如我们在 build.grad ...
- MicroPython的开发板
比如: pyboard micro:bit ESP8266/ESP32 stm32等等 什么是pyboard? pyboard是官方的MicroPython微控制器板,完全支持软件功能.硬件有: ST ...
- Go语言中的byte和rune区别、对比
Go语言中byte和rune实质上就是uint8和int32类型.byte用来强调数据是raw data,而不是数字:而rune用来表示Unicode的code point.参考规范: uint8 t ...
- js学习——基础知识
数据类型 函数.方法 变量作用域 运算符 条件语句 break和continue typeof 错误(异常) 变量提升 严格模式 JSON void(0) JavaScript ...
- Android组件化demo实现以及遇坑分享
首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo 作者:TenzLiu原文链接:https://www.jianshu ...
- Java中关于string的些许问题及解析
问题一:String 和 StringBuffer 的区别JAVA 平台提供了两个类: String 和 StringBuf fer ,它们可以储存和操作字符串,即包含多个字符的字符数据.这个 Str ...