详解HTML5 使用video标签实现选择摄像头功能


Posted in Javascript onOctober 25, 2017

详解HTML5 使用video标签实现选择摄像头功能

1. html

// jquery reference  
// <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script> 
// 
 
 
  <input type="hidden" name="imgValue" id="imgValue" /> 
  <button id="btnOpen1" class="btn btn-default" type="button" >Open WebCam</button> 
  <select id="videoSource" ></select> 
 
 
  <div id="vdoOne" style="display:none"> 
    <video id="video" style="margin-top:15px;margin-bottom:15px;" width="300" autoplay></video> 
    <canvas id="canvasPreview" style="margin-top:15px;" width="300" height="224"></canvas> 
    <canvas id="canvasUpload" style="display:none;" width='300' height='224'></canvas> 
    <button id="snap" class="btn btn-default" type="button">Snap Photo</button> 
  </div>

2. javascript

<script> 
 
 
//// Elements for taking the snapshot 
    var canvasPreview = document.getElementById('canvasPreview'); 
    var canvasUpload = document.getElementById('canvasUpload'); 
    var contextPreview = canvasPreview.getContext('2d'); 
    var contextUpload = canvasUpload.getContext('2d'); 
 
 
 
 
    //#################### Video Source #######################3 
    var videoElement = document.querySelector('video'); 
    var videoSelect = document.querySelector('select#videoSource'); 
 
 
    navigator.mediaDevices.enumerateDevices() 
      .then(gotDevices).then(getStream).catch(handleError); 
 
 
    videoSelect.onchange = getStream; 
 
 
 
 
    function gotDevices(deviceInfos) { 
      for (var i = 0; i < deviceInfos.length; ++i) { 
        var deviceInfo = deviceInfos[i]; 
        var option = document.createElement('option'); 
        option.value = deviceInfo.deviceId; 
        if (deviceInfo.kind === 'videoinput') { 
          option.text = deviceInfo.label || 
            'camera ' + 
            (videoSelect.length + 1); 
          videoSelect.appendChild(option); 
        } else { 
          console.log('Found ome other kind of source/device: ', deviceInfo); 
        } 
      } 
    } 
 
 
    var _streamCopy = null; 
    function getStream() { 
      if (_streamCopy != null) { 
        try { 
          _streamCopy.stop(); // if this method doesn't exist, the catch will be executed. 
        } catch (e) { 
          _streamCopy.getVideoTracks()[0].stop(); // then stop the first video track of the stream 
        } 
      } 
       
      var constraints = { 
        audio:false, 
        video: { 
          optional: [ 
            { 
              sourceId: videoSelect.value 
            } 
          ] 
        } 
      }; 
       
      navigator.mediaDevices.getUserMedia(constraints).then(gotStream).catch(handleError); 
    } 
 
 
    function gotStream(stream) { 
      _streamCopy = stream; // make stream available to console 
      videoElement.srcObject = stream; 
    } 
 
 
    function handleError(error) { 
      alert(error.name + ": " + error.message); 
    } 
 
 
    //######################## End Video Source ################# 
 
 
 
 
    // Get access to the camera! 
    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { 
      navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) { 
        videoElement.src = window.URL.createObjectURL(stream); 
        videoElement.play(); 
 
 
      }); 
    } else { 
      document.getElementById("pnlVideo1").style.display = "none"; 
    } 
 
 
 
 
    //// Trigger photo take 
    document.getElementById("snap").addEventListener("click", 
      function() { 
        contextPreview.drawImage(videoElement, 0, 0, 300, 224); 
        contextUpload.drawImage(videoElement, 0, 0, 300, 224); 
        document.getElementById("video").style.display = "none"; 
        document.getElementById("snap").style.display = "none"; 
        document.getElementById("canvasPreview").style.display = "block"; 
 
 
        var image = document.getElementById("canvasUpload").toDataURL("image/jpeg"); 
        image = image.replace('data:image/jpeg;base64,', ''); 
        $("#imgValue").val(image); 
         
        alert("image value :" + image); 
      }); 
 
 
    //// Trigger photo take 
 
 
 
 
    document.getElementById("btnOpen1").addEventListener("click", 
      function() { 
        document.getElementById("vdoOne").style.display = "block"; 
        document.getElementById("video").style.display = "block"; 
        document.getElementById("snap").style.display = "block"; 
        document.getElementById("canvasPreview").style.display = "none"; 
      }); 
       
</script>

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript 数组的 uniq 方法
Jan 23 Javascript
P3P Header解决Cookie跨域的问题
Mar 12 Javascript
JavaScript中的函数模式详解
Feb 11 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
Mar 26 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
Oct 14 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 Javascript
一道面试题引发的对javascript类型转换的思考
Mar 06 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
vue 数组和对象不能直接赋值情况和解决方法(推荐)
Oct 25 #Javascript
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 #Javascript
javascript计算对象长度的方法
Oct 25 #Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 #Javascript
Angular4实现鼠标悬停3d倾斜效果
Oct 25 #Javascript
详解vue 组件之间使用eventbus传值
Oct 25 #Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
Oct 25 #Javascript
You might like
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
Javascript模块模式分析
2008/05/16 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
js实现验证码功能
2020/07/24 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
在漏洞利用Python代码真的很爽
2007/08/26 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Python字符编码判断方法分析
2016/07/01 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
python读取中文txt文本的方法
2018/04/12 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
走进科学观后感
2015/06/18 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Elasticsearch 数据类型及管理
2022/04/19 Python