1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
   | <!DOCTYPE html>
  <video width="640" height="480" autoplay></video> <canvas width="640" height="480"></canvas> <canvas width="640" height="480"></canvas>
  <script>
  var video = document.querySelector('video'); var canvas = document.querySelectorAll('canvas')[0]; var canvasForDiff = document.querySelectorAll('canvas')[1];
 
  navigator.mediaDevices.getUserMedia({     video: true,      }, success, error);
  function success(stream) {     video.src = window.webkitURL.createObjectURL(stream);     video.play(); }
  function error(err) {     alert('video error: ' + err) }
 
  var context = canvas.getContext('2d'),     diffCtx = canvasForDiff.getContext('2d');
  diffCtx.globalCompositeOperation = 'difference';
  var preFrame,        curFrame;   
  var diffFrame;  
 
  function captureAndSaveFrame(){     preFrame = curFrame;     context.drawImage(video, 0, 0, 640, 480);     curFrame = canvas.toDataURL();   }
 
  function drawImg(src, ctx){     ctx = ctx || diffCtx;     var img = new Image();     img.src = src;     ctx.drawImage(img, 0, 0, 640, 480); }
 
  function renderDiff(){     if(!preFrame || !curFrame) return;     diffCtx.clearRect(0, 0, 640, 480);     drawImg(preFrame);     drawImg(curFrame);     diffFrame = diffCtx.getImageData( 0, 0, 640, 480 );   }
 
  function calcDiff(){     if(!diffFrame) return 0;     var cache = arguments.callee,         count = 0;     cache.total = cache.total || 0;      for (var i = 0, l = diffFrame.width * diffFrame.height * 4; i < l; i += 4) {         count += diffFrame.data[i] + diffFrame.data[i + 1] + diffFrame.data[i + 2];         if(!cache.isLoopEver){               cache.total += 255 * 3;            }     }     cache.isLoopEver = true;     count *= 3;            return Number(count/cache.total).toFixed(2); }
 
 
  function submit(){     var diff = '<img src="' + curFrame + '" />';      }
 
  function timer(delta){     setTimeout(function(){         captureAndSaveFrame();         renderDiff();         if(calcDiff() > 0.2){               submit()         }
          timer(delta)     }, delta || 500); }
  timer(); </script>
   |