js+HTML5基于过滤器从摄像头中捕获视频的方法


Posted in Javascript onJune 16, 2015

本文实例讲述了js+HTML5基于过滤器从摄像头中捕获视频的方法。分享给大家供大家参考。具体如下:

index.html页面:

<div class="warning">
<h2>Native web camera streaming (getUserMedia) is not supported in this browser.</h2>
</div>
<div class="container">
  <h3>Current filter is: None</h3>
  <button>Click here to change video filter</button>
  <div style="clear:both"></div>
  <div class="col">
    <h2>HTML5 <video> object</h2>
    <video></video>
  </div>
  <div class="col">
    <h2>HTML5 <canvas> object</h2>
    <canvas width="600" height="450"></canvas>
  </div>
</div>

style.css文件:

.grayscale{
  -webkit-filter:grayscale(1);
  -moz-filter:grayscale(1);
  -o-filter:grayscale(1);
  -ms-filter:grayscale(1);
  filter:grayscale(1);
}
.sepia{
  -webkit-filter:sepia(0.8);
  -moz-filter:sepia(0.8);
  -o-filter:sepia(0.8);
  -ms-filter:sepia(0.8);
  filter:sepia(0.8);
}
.blur{
  -webkit-filter:blur(3px);
  -moz-filter:blur(3px);
  -o-filter:blur(3px);
  -ms-filter:blur(3px);
  filter:blur(3px);
}
.brightness{
  -webkit-filter:brightness(0.3);
  -moz-filter:brightness(0.3);
  -o-filter:brightness(0.3);
  -ms-filter:brightness(0.3);
  filter:brightness(0.3);
}
.contrast{
  -webkit-filter:contrast(0.5);
  -moz-filter:contrast(0.5);
  -o-filter:contrast(0.5);
  -ms-filter:contrast(0.5);
  filter:contrast(0.5);
}
.hue-rotate{
  -webkit-filter:hue-rotate(90deg);
  -moz-filter:hue-rotate(90deg);
  -o-filter:hue-rotate(90deg);
  -ms-filter:hue-rotate(90deg);
  filter:hue-rotate(90deg);
}
.hue-rotate2{
  -webkit-filter:hue-rotate(180deg);
  -moz-filter:hue-rotate(180deg);
  -o-filter:hue-rotate(180deg);
  -ms-filter:hue-rotate(180deg);
  filter:hue-rotate(180deg);
}
.hue-rotate3{
  -webkit-filter:hue-rotate(270deg);
  -moz-filter:hue-rotate(270deg);
  -o-filter:hue-rotate(270deg);
  -ms-filter:hue-rotate(270deg);
  filter:hue-rotate(270deg);
}
.saturate{
  -webkit-filter:saturate(10);
  -moz-filter:saturate(10);
  -o-filter:saturate(10);
  -ms-filter:saturate(10);
  filter:saturate(10);
}
.invert{
  -webkit-filter:invert(1);
  -moz-filter:invert(1);
  -o-filter: invert(1);
  -ms-filter: invert(1);
  filter: invert(1);
}

script.js 文件:

// Main initialization
document.addEventListener('DOMContentLoaded', function() {
  // Global variables
  var video = document.querySelector('video');
  var audio, audioType;
  var canvas = document.querySelector('canvas');
  var context = canvas.getContext('2d');
  // Custom video filters
  var iFilter = 0;
  var filters = [
    'grayscale',
    'sepia',
    'blur',
    'brightness',
    'contrast',
    'hue-rotate',
    'hue-rotate2',
    'hue-rotate3',
    'saturate',
    'invert',
    'none'
  ];
  // Get the video stream from the camera with getUserMedia
  navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia || navigator.msGetUserMedia;
  window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
  if (navigator.getUserMedia) {
    // Evoke getUserMedia function
    navigator.getUserMedia({video: true, audio: true}, onSuccessCallback, onErrorCallback);
    function onSuccessCallback(stream) {
      // Use the stream from the camera as the source of the video element
      video.src = window.URL.createObjectURL(stream) || stream;
      // Autoplay
      video.play();
      // HTML5 Audio
      audio = new Audio();
      audioType = getAudioType(audio);
      if (audioType) {
        audio.src = 'polaroid.' + audioType;
        audio.play();
      }
    }
    // Display an error
    function onErrorCallback(e) {
      var expl = 'An error occurred: [Reason: ' + e.code + ']';
      console.error(expl);
      alert(expl);
      return;
    }
  } else {
    document.querySelector('.container').style.visibility = 'hidden';
    document.querySelector('.warning').style.visibility = 'visible';
    return;
  }
  // Draw the video stream at the canvas object
  function drawVideoAtCanvas(obj, context) {
    window.setInterval(function() {
      context.drawImage(obj, 0, 0);
    }, 60);
  }
  // The canPlayType() function doesn't return true or false. In recognition of how complex
  // formats are, the function returns a string: 'probably', 'maybe' or an empty string.
  function getAudioType(element) {
    if (element.canPlayType) {
      if (element.canPlayType('audio/mp4; codecs="mp4a.40.5"') !== '') {
        return('aac');
      } else if (element.canPlayType('audio/ogg; codecs="vorbis"') !== '') {
        return("ogg");
      }
    }
    return false;
  }
  // Add event listener for our video's Play function in order to produce video at the canvas
  video.addEventListener('play', function() {
    drawVideoAtCanvas(this, context);
  }, false);
  // Add event listener for our Button (to switch video filters)
  document.querySelector('button').addEventListener('click', function() {
    video.className = '';
    canvas.className = '';
    var effect = filters[iFilter++ % filters.length]; // Loop through the filters.
    if (effect) {
      video.classList.add(effect);
      canvas.classList.add(effect);
      document.querySelector('.container h3').innerHTML = 'Current filter is: ' + effect;
    }
  }, false);
}, false);

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 继承详解(一)
Jul 13 Javascript
你需要知道的10个最佳javascript开发实践小结
Apr 15 Javascript
盘点javascript 正则表达式中 中括号的【坑】
Mar 16 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
JS实现贪吃蛇游戏
Nov 15 Javascript
动态加载jQuery的方法
Jun 16 #Javascript
详解AngularJS中的表格使用
Jun 16 #Javascript
js+HTML5实现视频截图的方法
Jun 16 #Javascript
AngularJS中的过滤器使用详解
Jun 16 #Javascript
简述AngularJS的控制器的使用
Jun 16 #Javascript
详解AngularJS中的表达式使用
Jun 16 #Javascript
整理AngularJS中的一些常用指令
Jun 16 #Javascript
You might like
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
php简单实现数组分页的方法
2016/04/30 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
Python全局变量操作详解
2015/04/14 Python
Python实现批量压缩图片
2018/01/25 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
外贸业务员求职信范文
2013/12/12 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
大学新生欢迎词
2014/01/10 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
1000字打架检讨书
2014/11/03 职场文书
挂靠协议书
2015/01/27 职场文书
2015年科普工作总结
2015/07/23 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技
方法汇总:Python 安装第三方库常用
2022/04/26 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android