博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS打开摄像头并截图上传
阅读量:4085 次
发布时间:2019-05-25

本文共 2934 字,大约阅读时间需要 9 分钟。

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

http://www.cnblogs.com/imwtr/p/6413595.html?utm_source=tuicool&utm_medium=referral 

1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签

2. 截取图片主要用到canvas绘图,使用drawImage方法将video的内容绘至canvas中

3. 将截取的内容上传至服务器,将canvas中的内容转为base64格式上传,后端(PHP)通过file_put_contents将其转为图片

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

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

 

1. 打开摄像头

getUserMedia 有新版本和旧版本两种,

 

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

// 获取媒体方法(旧方法)    navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
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 对象下

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数组是按第一个参数倒序排列的

比如现在定义了

{    video: true,    audio: true}

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

同理,0对应于audio的track

 

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

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

 

  

 

2. 截取图像

将内容写入即可

// 截取图像    snap.addEventListener('click', function() {        context.drawImage(video, 0, 0, 200, 150);    }, false);

 

3. 关闭摄像头

// 关闭摄像头    close.addEventListener('click', function() {        mediaStreamTrack && mediaStreamTrack.stop();    }, false);

 

4. 上传截取的图像

canvas.toDataURL('image/png')

// 上传截取的图像    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的头部信息字段去掉再保存,否则似乎图像是损坏无法打开滴

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

 

完整JS代码

1  2     

 

你可能感兴趣的文章
React Hooks 一步到位
查看>>
React Redux常见问题总结
查看>>
前端 DSL 实践指南
查看>>
ReactNative: 自定义ReactNative API组件
查看>>
cookie
查看>>
总结vue知识体系之实用技巧
查看>>
PM2 入门
查看>>
掌握 TS 这些工具类型,让你开发事半功倍
查看>>
前端如何搭建一个成熟的脚手架
查看>>
Flutter ListView如何添加HeaderView和FooterView
查看>>
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>
Flutter Animation动画
查看>>
Flutter 全局监听路由堆栈变化
查看>>
Flutter学习之插件开发、自定义字体、国际化
查看>>
Android 混合Flutter之产物集成方式
查看>>
Flutter混合开发二-FlutterBoost使用介绍
查看>>
Flutter 混合开发框架模式探索
查看>>
Flutter 核心原理与混合开发模式
查看>>
Flutter Boost的router管理
查看>>