详解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 相关文章推荐
jQuery调用WebService的实现代码
Jun 19 Javascript
window.navigate 与 window.location.href 的使用区别介绍
Sep 21 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
JS+CSS实现可拖动的弹出提示框
Feb 16 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
JavaScript 冒泡排序和选择排序的实现代码
Sep 03 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
js简易版购物车功能
Jun 17 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 jQuery
新手简单了解vue
May 29 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
Jan 26 Javascript
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上的memcache和memcached两个pecl库
2010/03/29 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
Python守护线程用法实例
2017/06/23 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
基于Python的OCR实现示例
2020/04/03 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
大四学年自我鉴定
2013/11/13 职场文书
高二化学教学反思
2014/01/30 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
购房协议书范本
2014/04/11 职场文书
大一新生期末自我评价
2014/09/12 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
党员作风建设整改方案
2014/10/27 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python