几个月前,我一直关注着比特币的爆发并且在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捕获网络摄像头视频的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  2. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  3. ffplay 播放网络摄像头视频

    shell脚本如下,无须加port ffplay rtsp://cameral_ip

  4. 在Jetson TX2上捕获、显示摄像头视频

    参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...

  5. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

  6. 在 HTML5 中捕获音频和视频

    简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...

  7. 在Windows IoT上使用网络摄像头

    在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用.但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能. 关于摄像头的寻找和拍摄 ...

  8. TVideoGrabber如何将网络摄像头影像实时发布到网络

    在TVideoGrabber中如何将网络摄像头影像实时发布到网络?如何设置正在运行TVideoGrabber的一台电脑,同时通过另一台电脑在网络中实时的观看在线视频呢? 在这里称发送视频流的电脑为“m ...

  9. 网络语音视频技术浅议 Visual Studio 2010(转)

    我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...

随机推荐

  1. RabbitMQ 选型和对比

    背景 这个纯粹是记下知识点,知道自己在这个时候了解过这个技术.技术点网上很多,就不多说了.只是想起多年前做过的一次项目,是多个项目整合,各种数据库,java和c#项目,互相调来调去,甚至直接链接对方数 ...

  2. 基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用

    基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用 HBase是一种分布式.面向列的NoSQL数据库,基于HDFS存储,以表的形式存储数据,表由行和列组成,列划分到列族中.HBase ...

  3. django-form介绍

    Django form表单   目录 普通方式手写注册功能 views.py login.html 使用form组件实现注册功能 views.py login2.html 常用字段与插件 initia ...

  4. Python-数据库 基本SQL语句

    1. 数据库是什么 2. MySQL安装 3. 用户授权 4. 数据库操作 - 数据表 - 数据类型 - 是否可以为空 - 自增 - 主键 - 外键 - 唯一索引 数据行 增 删 改 查 排序: or ...

  5. yun

    # Author:zhang# -*- coding:utf-8 -*-"""https://workyun.com/ 云端工作"""imp ...

  6. swift 实践- 04 -- UIButton

    import UIKit class ViewController: UIViewController { // 按钮的创建 // UIButtonType.system: 前面不带图标, 默认文字为 ...

  7. L1和L2正则

    https://blog.csdn.net/jinping_shi/article/details/52433975

  8. Linux 上的 SQL Server 2017 的安装指南

    一:介绍背景 微软在2016年 3 月首次对外宣布了 Linux 版的 SQL Server,并于2017年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会 ...

  9. Confluence 6 配置 Web 代理支持

    这个页面中的相关平台中的内容是不被支持的.因此,Atlassian 支持不能保证能够为你提供任何支持.请注意,这个页面下面提供的信息仅为你提供参考同时也不能保证所有的的配置能正常工作.如果你按照本页面 ...

  10. Confluence 6 workbox 配置查询间隔

    查询间隔在Confluence 服务器中的 workbox 被用来显示应用内通知和任务. 激活的查询间隔(Active polling interval) Confluence 将会等待多少时间(秒) ...