详解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 实现GridView异步排序、分页的代码
Feb 06 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
Jun 04 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
javascript实现图像循环明暗变化的方法
Feb 25 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
通过滑动翻页效果实现和移动端click事件问题
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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
Python中的条件判断语句基础学习教程
2016/02/07 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
车辆安全检查制度
2014/01/12 职场文书
工作表现自我评价
2014/02/08 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
信访工作个人总结
2015/03/03 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
债务纠纷代理词
2015/05/25 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android