前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JS打开摄像头并截图上传

JS打开摄像头并截图上传

作者头像
书童小二
发布于 2018-09-03 11:29:04
发布于 2018-09-03 11:29:04
5.9K00
代码可运行
举报
文章被收录于专栏:前端儿前端儿
运行总次数:0
代码可运行

直入正题,JS打开摄像头并截图上传至后端的一个完整步骤

1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签 2. 截取图片主要用到canvas绘图,使用drawImage方法将video的内容绘至canvas中 3. 将截取的内容上传至服务器,将canvas中的内容转为base64格式上传,后端(PHP)通过file_put_contents将其转为图片

要注意的是,在chrome以外的浏览器中,使用摄像头或多或少会出现一些问题,可能也是老问题了,所以以下代码主要基于chrome使用

比如在最新版FireFox中的报错,不知为啥

1. 打开摄像头

getUserMedia 有新版本和旧版本两种,建议使用新版本

旧版本位于navigator 对象下,根据浏览器不同有所不同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取媒体方法(旧方法)
    navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (navigator.getMedia) {
        navigator.getMedia({
            video: true
        }, function(stream) {
            mediaStreamTrack = stream.getTracks()[0];

            video.src = (window.URL || window.webkitURL).createObjectURL(stream);
            video.play();
        }, function(err) {
            console.log(err);
        });
    }

第一个参数中指示需要使用视频(video)或音频(audio),更多参见文档

第二个参数中指示调用成功后的回调,其中带一个参数(MediaStream),在旧版本中可以直接通过调用MediaStream.stop() 来关闭摄像头,不过在新版之中已废弃。需要使用MediaStream.getTracks()[index].stop() 来关闭相应的Track

第三个参数指示调用失败后的回调

新版本位于navigator.mediaDevices 对象下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({
            video: true,
            audio: true
        }).then(function(stream) {
            console.log(stream);

            mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];

            video.src = (window.URL || window.webkitURL).createObjectURL(stream);
            video.play();
        }).catch(function(err) {
            console.log(err);
        })
    }

与旧版类似,不过该方法返回了一个Promise对象,可以使用then和catch表示成功与失败的回调

更多参见文档

需要注意的是,MediaStream.getTracks() 返回的Tracks数组是按第一个参数倒序排列的

比如现在定义了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    video: true,
    audio: true
}

想关闭摄像头,就需要调用MediaStream.getTracks()[1].stop();

同理,0对应于audio的track

使用createObjectURL 将MediaStream写入video标签,就能够存储实时的媒体流数据(也可以方便的实时查看画面)

旧版本中webkitURL 对象以不被支持,需要使用URL对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <video width="200" height="150"></video>
    <canvas width="200" height="150"></canvas>

    <p>
        <button id="snap">截取图像</button>
        <button id="close">关闭摄像头</button>
        <button id="upload">上传图像</button>
    </p>

    <img id="uploaded" width="200" height="150" />

2. 截取图像

将内容写入即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 截取图像
    snap.addEventListener('click', function() {
        context.drawImage(video, 0, 0, 200, 150);
    }, false);

3. 关闭摄像头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 关闭摄像头
    close.addEventListener('click', function() {
        mediaStreamTrack && mediaStreamTrack.stop();
    }, false);

4. 上传截取的图像

canvas.toDataURL('image/png')

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 上传截取的图像
    upload.addEventListener('click', function() {
        jQuery.post('/uploadSnap.php', {
            snapData: canvas.toDataURL('image/png')
        }).done(function(rs) {
            rs = JSON.parse(rs);

            console.log(rs);

            uploaded.src = rs.path;
        }).fail(function(err) {
            console.log(err);
        });
    }, false);

而这里的后端(PHP)则将获取的内容转换成图像文件保存

需要注意的是,要将base64的头部信息字段去掉再保存,否则似乎图像是损坏无法打开滴

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

    $snapData = $_POST['snapData'];
    $snapData = str_replace('data:image/png;base64,', '', $snapData);
    // $snapData = str_replace(' ', '+', $snapData);

    $img = base64_decode($snapData);

    $uploadDir = 'upload/';
    $fileName = date('YmdHis', time()) . uniqid();

    if (!(file_put_contents($uploadDir . $fileName, $img))) {
        echo json_encode(array('code' => 500, 'msg' => '文件上传失败'));
    } else {
        echo json_encode(array('code' => 200, 'msg' => '文件上传成功', 'path' => $uploadDir . $fileName));
    }

?>

完整JS代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 <script type="text/javascript" src="jquery.js"></script>
 2     <script type="text/javascript">
 3     function $(elem) {
 4         return document.querySelector(elem);
 5     }
 6 
 7     // 获取媒体方法(旧方法)
 8     navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
 9 
10     var canvas = $('canvas'),
11         context = canvas.getContext('2d'),
12         video = $('video'),
13         snap = $('#snap'),
14         close = $('#close'),
15         upload = $('#upload'),
16         uploaded = $('#uploaded'),
17         mediaStreamTrack;
18 
19     // 获取媒体方法(新方法)
20     // 使用新方法打开摄像头
21     if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
22         navigator.mediaDevices.getUserMedia({
23             video: true,
24             audio: true
25         }).then(function(stream) {
26             console.log(stream);
27 
28             mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];
29 
30             video.src = (window.URL || window.webkitURL).createObjectURL(stream);
31             video.play();
32         }).catch(function(err) {
33             console.log(err);
34         })
35     }
36     // 使用旧方法打开摄像头
37     else if (navigator.getMedia) {
38         navigator.getMedia({
39             video: true
40         }, function(stream) {
41             mediaStreamTrack = stream.getTracks()[0];
42 
43             video.src = (window.URL || window.webkitURL).createObjectURL(stream);
44             video.play();
45         }, function(err) {
46             console.log(err);
47         });
48     }
49 
50     // 截取图像
51     snap.addEventListener('click', function() {
52         context.drawImage(video, 0, 0, 200, 150);
53     }, false);
54 
55     // 关闭摄像头
56     close.addEventListener('click', function() {
57         mediaStreamTrack && mediaStreamTrack.stop();
58     }, false);
59 
60     // 上传截取的图像
61     upload.addEventListener('click', function() {
62         jQuery.post('/uploadSnap.php', {
63             snapData: canvas.toDataURL('image/png')
64         }).done(function(rs) {
65             rs = JSON.parse(rs);
66 
67             console.log(rs);
68 
69             uploaded.src = rs.path;
70         }).fail(function(err) {
71             console.log(err);
72         });
73     }, false);
74 
75     </script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js调用摄像头
详情源码请参见下方的 GitHub  !!! 1 <div> 2 <b>调用移动端摄像头</b><br> 3 <label>照相机: <input type="file" id='image' accept="image/*" capture='camera'></label> 4 <label>摄像机: <input type="file" id='video' accept="video/*" capture='camcorder'></l
ProsperLee
2018/10/24
20.4K2
js调用摄像头
【Go 语言社区】HTML5 Canvas+JS控制电脑或手机上的摄像头实例
移动设备和桌面电脑上的客户端API起初并不是同步的。最初总是移动设备上先拥有某些功能和相应的API,但慢慢的,这些API会出现在桌面电脑上。其中一个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。 HTML代码 下面的代码里我写了一部分注释,请阅读: <!-- 理想情况下我们应该先判断你的设备上是否 有摄像头或相机,但简单起见,我们在这里直接 写出了HTML标记,而不是用JavaScript
李海彬
2018/03/20
2K0
Html5调用手机摄像头并实现人脸识别的实现
这是一种基于HTML5的简单示例,展示如何使用JavaScript来调用手机摄像头并实现人脸识别。
七条猫
2024/10/14
3800
Html5调用手机摄像头并实现人脸识别的实现
探秘移动端网页调用摄像头的两种方式
PC 端网页调用摄像头的场景想必大家并不陌生,打开一个网址,开启摄像头开始笔试/视频聊天/直播等。
掘金安东尼
2022/09/22
4.4K0
探秘移动端网页调用摄像头的两种方式
js调用USB摄像头拍照上传照片
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices
用户7043603
2022/02/25
3.6K0
网页调用本地摄像头,获取视频图片
PC端Web网页跳用本地摄像头,实时获取图片。(注意事项:如果是本地localhost可直接调用,挂到服务器必须使用https访问)
用户7741497
2022/02/28
1.8K0
js调用网页摄像头进行直播/拍照
具体文档可查看:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
仙士可
2022/02/18
5.1K0
js调用网页摄像头进行直播/拍照
Web端拍照的另一种实现方式
上篇文章大致总结了成为技术负责人需要的能力。今天本来聊一下web端的拍照方案方案。web端的拍照方案大致有以下两种,一是我们比较常见的图片上传的方案<input type="file" capture=camera/>可以调起摄像头。另外一种就不太常见了,利用webrtc的api方法navigator.mediaDevices.getUserMedia。
terrence386
2022/07/14
4680
html5摄像头调用
实现了基本的摄像头调用和拍照,实现思路非常简单,基本上只是在调用api,唯一恶心的地方在于api版本比较多,不得不多做一些判断。具体的api介绍、使用和参数可以查看MediaDevices.getUserMedia()。
ianzhi
2019/07/31
6.8K1
H5利用JS调用电脑摄像头实现拍照效果
今天学习了调用电脑摄像头,利用canvas画布将视频当前帧转换成图片的实例,其中用到了 mediaDevices.getUserMedia 方法。该方法提示用户允许使用媒体输入,产生包含所请求类型的媒体轨道。包括视频轨道(由诸如照相机,视频记录设备,屏幕共享服务等的硬件或虚拟视频源产生),音频轨道(类似地,由物理或虚拟音频源,如麦克风,A / D转换器等),以及其他可能的轨道类型。
德顺
2019/11/12
9.7K1
Webrtc及WEB端音视频设备获取及流处理
注意本文和之前Electron获取设备的文章有重合,但是也不是一样的,因为在Electron中我们不但能用HTML的API,也能使用Electron的API,但是WEB中就有局限了,在WEB中就实现不了直接分享主屏幕,必须用户选择。
码客说
2022/09/23
2.5K0
Webrtc及WEB端音视频设备获取及流处理
JS 调取摄像头
截止目前(2016-06-23)为止,js 调取摄像头实现视频聊天,部分浏览器还是不怎么支持的。
White feathe
2021/12/08
2.7K0
JS 调取摄像头
神奇canvas 带你实现魔法摄像头
我们用手机的摄像头自拍,很容易实现 简单的自拍效果,如复古、黑白等等。其实我们使用web端的JavaScript也是可以实现的。接下来就带领小伙伴实现一个魔法摄像头。并且提供了截图下载功能。
万少
2025/02/10
680
神奇canvas 带你实现魔法摄像头
WebRTC网页打开摄像头并录制视频
前面我们能打开本地摄像头,并且在网页上看到摄像头的预览图像。 本文我们使用MediaRecorder来录制视频。在网页上播放录制好的视频,并能提供下载功能。
落寞的鱼丶
2022/02/26
1.6K0
html5打开摄像头
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>Smart Home - Camera</title> <link href="css/main.css" rel="stylesheet" type="text/css"> <script src="
李海彬
2018/03/20
2.3K0
web H5摄像头-Media-Recorder-API-Demo
media-recorder-api <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>拍照2</title> </head> <body> <div style="display: block"> <button id="take" >拍照</button> <button onclick="upload()" >保存照片</button> <button
2021/11/08
5500
Web调用网络摄像头及各类错误处理
最近由于业务的原因,需要在Web端页面接入调试各类的网络摄像头,遇到了很多匪夷所思的问题(说的就是读得出摄像头的品牌,读不出摄像头的分辨率)。于是整理了这篇文章作为备忘录,也希望能帮到有类似的小伙伴们。
huofo
2022/03/18
1.7K0
Web调用网络摄像头及各类错误处理
Safari上使用WebRTC指南
原文:https://webrtchacks.com/guide-to-safari-webrtc/
LiveVideoStack
2021/09/01
3.4K0
WEBRTC 实现浏览器拍照
最近的几个需求都涉及到了扫码和拍照之类的功能,扫码用的是插件 html5-qrcode,拍照就自己写了一下,没多少行代码。
wade
2023/09/01
3250
WEBRTC 实现浏览器拍照
H5中JS调用摄像头截图拍照并发送
H5中JS调用摄像头截图拍照并发送 <!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>loding...</title> <style> body{background:#ffffff}.clock{position:absolute;opacity:1}.fill .clock{left:50%;top:50%}.centre{position
骤雨重山
2022/01/17
2.7K0
相关推荐
js调用摄像头
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文