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

详解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>

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

(0)

相关推荐

  • 使用js检测浏览器是否支持html5中的video标签的方法

    复制代码 代码如下: //检测是否支持HTML5function checkVideo() {    if (!!document.createElement('video').canPlayType) {        var vidTest = document.createElement("video");        oggTest = vidTest.canPlayType('video/ogg; codecs="theora, vorbis"');  

  • transform实现HTML5 video标签视频比例拉伸实例详解

    曾几何时,项目中有碰到视频比例拉伸的需求,但是发现这个看似再普通不过的一个需求,找遍全网至今都没有找到解决方法.因为强制给video标签设置width和height的话只会将video的显示区域拉伸,但是里面的视频还是保持原始比例,怎么调都没用: 因为当我横向拉伸时: 当我纵向拉伸时: 2016-09-21 11:15:40 更新: 感谢 @RileyRen 提醒,原来还有object-fit这一属性,把它设置为fill就满足需求了,泪奔~,这篇文章就当看个笑话吧,哎,不过可以看看我家喵星人的处

  • 一个html5播放视频的video控件只支持android的默认格式mp4和3gp

    复制代码 代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body>

  • Android编程使WebView支持HTML5 Video全屏播放的解决方法

    本文实例讲述了Android编程使WebView支持HTML5 Video全屏播放的解决方法.分享给大家供大家参考,具体如下: 1)需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做,具体如下: a. 如果要声明整个应用都要加速: 复制代码 代码如下: <application ... android:hardwareAccelerated ="tr

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

    详解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"

  • 详解BeautifulSoup获取特定标签下内容的方法

    以下是个人在学习beautifulSoup过程中的一些总结,目前我在使用爬虫数据时使用的方法的是:先用find_all()找出需要内容所在的标签,如果所需内容一个find_all()不能满足,那就用两个或者多个.接下来遍历find_all的结果,用get_txt().get('href').得到文本或者链接,然后放入各自的列表中.这样做有一个缺点就是txt的数据是一个单独的列表,链接的数据也是一个单独的列表,一方面不能体现这些数据之间的结构性,另一方面当想要获得更多的内容时,就要创建更多的空列表

  • Springboot项目使用html5的video标签完成视频播放功能

    文件的上传与下载会另外再写一篇博客,本篇博客只是记录视频播放功能的实现过程 1.首先引入pom文件: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi

  • 详解Python排序算法的实现(冒泡,选择,插入,快速)

    目录 1. 前言 2. 冒泡排序算法 2.1 摆擂台法 2.2 相邻两个数字相比较 3. 选择排序算法 4. 插入排序 5. 快速排序 6. 总结 1. 前言 所谓排序,就是把一个数据群体按个体数据的特征按从大到小或从小到大的顺序存放. 排序在应用开发中很常见,如对商品按价格.人气.购买数量……显示. 初学编程者,刚开始接触的第一个稍微有点难理解的算法应该是排序算法中的冒泡算法. 我初学时,“脑思维”差点绕在 2 个循环结构的世界里出不来了.当时,老师要求我们死记冒泡的口诀,虽然有点搞笑,但是当

  • 详解Java如何实现百万数据excel导出功能

    目录 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个sheet 5.计算limit的起始位置 6.文件上传到OSS 7.通过WebSocket推送通知 8.总条数可配置 9.order by商品编号 总结 前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在UI界面上点击全部导出按钮,就能导

  • 详解扩展tk.mybatis的批量更新的功能

    tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现. 批量更新网上主要有2种方式:case when方式.foreach方式 但是foreachzhe这种方式效率非常低下,不知道为何那多么帖子在流传,请看我另一个文章. 扩展tk.mybatis的批量更新,采用case when方式,源码干货如下: 首先定义下mapper接口 import org.apache.ibatis.annotations.UpdateProvider; import java.util.

  • 详解js获取video任意时间的画面截图

    首先就是要把视频加载出来,然后使用canvas.getContext('2d').drawImage(videoElement, 0, 0, canvas.width, canvas.height);获取到当前视频时间的截图,需要不同时间的video视频图,设置video的currentTime(单位秒),然后videoElement这个对象信息会实时更新. 如果是视频是在阿里云OSS上就更方便了,poster="http://a-image-demo.oss-cn-qingdao.aliyun

  • 详解vue中router-link标签所必备了解的属性

    to 表示目标路由的链接. 当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象. <!-- 字符串 --> <router-link to="home">Home</router-link> <!-- 渲染结果 --> <a href="home" rel="external nofollow" >Home</a

  • 详解PHP素材图片上传、下载功能

    这里的下载是生成 zip 包进行下载,所以需要 PHP 的ZipArchive ()类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释.并且不包括 oss 之类的三方 上传 上传就很简单了,PHP 自带的 move_uploaded_file()函数就可以使用我们简单的文件上传了. 我们只需要把文件的路径存到数据库方便我们下载或展示时使用就 OK了. 这里需要注意上传的路径和文件名尽量不要包括中文. 下载 下载文件我们需要临时生成一个服务器的 zip 包,

  • 详解requestAnimationFrame和setInterval该如何选择

    目录 正文 requestAnimationFrame的工作方式 setInterval的工作方式 requestAnimationFrame和setInterval之间的区别 适用场景 写在后面 正文 在Web前端开发中,使用计时器是实现动画效果.周期性任务.定时器等常见操作的核心.JavaScript提供了两种计时器:requestAnimationFrame和setInterval.虽然它们看起来很相似,但它们的工作方式却有很大的不同. requestAnimationFrame的工作方式

随机推荐