【译】如何使用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(转)
我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...
随机推荐
- boost.lexical_cast 学习
1,字符串 到 数值类型的转换 2,数值 到 字符串的转换 3,异常处理情况 4,boost::lexical_cast 的原型: template<typename Target, typen ...
- <TCP/IP>地址解析协议ARP
从前两章中有学到,网络层地址和链路层地址是由不同的,一个是物理地址,一个是IP地址.物理地址固定存储在网卡中,不会改变,而IP地址是可以网络管理员和用户自己分配的 在传统的IPv4网络中,一台A主机要 ...
- $Django 站点:样式--文章--分类文章--文章详情--文章评论点赞--文章评论点赞统计(数据库优化)
<h3>个人站点下的</h3> 知识点 url (r'(?P<username>\w+)/p/(?P<id>\d+)', xiangxi,name='x ...
- ansible结合zabbix_api批量添加主机
批量添加zabbix监控 .使用ansible配置zabbix客户端 ①修改服务器的IP(域名),为了方便使用ansible来批量操作 等同于如下sed语句 sed -i 's#Server=1.1. ...
- Mac 上卸载 Java
如何在 Mac 上卸载 Java? 本文适用于: 平台: Macintosh OS X Java 版本: 7.0, 8.0 使用终端卸载 Oracle Java 注:要卸载 Java,必须具有管理员权 ...
- JQery插件clipboard.js ----将文本复制到剪贴板的现代化方法
### 之前用了js自带的剪贴板对象clipboardData 对象以为就可以实现粘贴复制,但是种只支持IE的. 就找了jq的一个插件Zclip,但是网上的说法是利用了flesh来实现的,我用了之后可 ...
- pipeline
执行顺序:pipeline 写 pipeline类class Scrapyproject1Pipeline(object): def process_item(self, item, spider): ...
- Navicat系列产品激活教程
准备 本教程可破解12.x版本,如果教程失效请联系我 # 19.1.11 破解暂时失效,请勿更新 (如已更新请卸载重新安装老版本,数据不会丢失 http://download.navicat.com/ ...
- 分析Vue框架源码心得
1.在封装一个公用组件,比如button按钮,我们多个地方使用,不同类型的button调用不同的方法,我们就可以这样用 代码片段: <lin-button v-for="(item,i ...
- 高性能MySQL(第3版) 中文PDF带目录清晰版
下载地址: <高性能MySQL(第3版)>编辑推荐:"只要你不敢以MySQL专家自诩,又岂敢错过这本神书?""一言以蔽之,写得好,编排得好,需要参考时容易到爆 ...