Skip to content

Instantly share code, notes, and snippets.

@sdellis
Created April 12, 2015 16:20
Show Gist options
  • Save sdellis/33dc4ccbe99ba936935d to your computer and use it in GitHub Desktop.
Save sdellis/33dc4ccbe99ba936935d to your computer and use it in GitHub Desktop.
Time-Lapse Recorder - JS + WebCam // source http://jsbin.com/buqiba/5
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="boilerplate widget factory">
<script src="http://code.jquery.com/jquery.min.js"></script>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<h2>Save demo</h2>
<p>After allowing the webcam in your browser, click record to start recording. <strong>Enjoy!</strong><br/>
<button class="record">record</button>
<button class="pause">pause</button></p>
<canvas id="canvas1"></canvas>
<br />
<form>
<div>
Format:<label><input type="radio" name="format" value="png" />png</label>
<label><input type="radio" name="format" value="jpeg" checked="checked" />jpeg</label>
<label><input type="radio" name="format" value="webp" />webp</label>
</div>
<div class="quality">
Quality:<label><input type="radio" name="quality" value="0.1" />poor (0.1)</label>
<label><input type="radio" name="quality" value="0.3" />low (0.3)</label>
<label><input type="radio" name="quality" value="0.7" checked="checked" />middle (0.7)</label>
<label><input type="radio" name="quality" value="1" />good (1)</label>
</div>
<div>
Estimated filesize: <em class="filesize">*</em>
</div>
</form>
<div class="thumb"></div>
<blockquote class="log"></blockquote>
<script id="jsbin-javascript">
(function(e){e.instacam=function(c,g){var a=this,d={width:400,height:300,sound:!1,opacity:1,brightness:1,contrast:1,saturation:0,hue:0,invert:0,grayscale:0,sepia:0,blur:0,url:"",filter:null,done:null,fail:null,unsupported:null},m=function(f){try{navigator.getUserMedia({video:!0,audio:a.settings.sound},function(k){f.src=window.URL.createObjectURL(k);var h=function(){requestAnimationFrame(h);"function"!=typeof a.settings.filter?c.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height):("undefined"==typeof a.buffer&&(a.buffer=document.createElement("canvas"),a.buffer.setAttribute("width",a.settings.width),a.buffer.setAttribute("height",a.settings.height),c.parentNode.insertBefore(a.buffer,c.nextSibling),e(a.buffer).hide()),a.buffer.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height),c.getContext("2d").putImageData(l(a.buffer.getContext("2d").getImageData(0,0,a.settings.width,a.settings.height)),0,0));var b=a.settings.opacity!=d.opacity?"opacity("+a.settings.opacity+") ":"",b=b+(a.settings.brightness!=d.brightness?"brightness("+a.settings.brightness+") ":""),b=b+(a.settings.contrast!=d.contrast?"contrast("+a.settings.contrast+") ":""),b=b+(a.settings.saturation!=d.saturation?"saturate("+a.settings.saturation+") ":""),b=b+(a.settings.hue!=d.hue?"hue-rotate("+a.settings.hue+"deg) ":""),b=b+(a.settings.invert!=d.invert?"invert("+a.settings.invert+") ":""),b=b+(a.settings.grayscale!=d.grayscale?"grayscale("+a.settings.grayscale+") ":""),b=b+(a.settings.sepia!=d.sepia?"sepia("+a.settings.sepia+") ":""),b=b+(a.settings.blur!=d.blur?"blur("+a.settings.blur+"px) ":""),b=b+(a.settings.url!=d.url?"url("+a.settings.url+") ":"");""!==b&&a.css!=b&&(e(c).css({filter:b,"-webkit-filter":b}),a.css=b);""===b&&(e(c).css({filter:"","-webkit-filter":""}),a.css="")};requestAnimationFrame(h);"function"==typeof a.settings.done&&a.settings.done(f,c)},function(){"function"==typeof a.settings.fail&&a.settings.fail(f,c)})}catch(k){"function"==typeof a.settings.fail&&a.settings.fail(f,c)}},l=function(f){for(var c=f.data,d=0;d<a.settings.height;d++)for(var e=0;e<a.settings.width;e++){var b=4*(a.settings.width*d+e),g=a.settings.filter({offset:b,x:e,y:d,red:c[b],green:c[b+1],blue:c[b+2],alpha:c[b+3]});c[b]=g[0];c[b+1]=g[1];c[b+2]=g[2];c[b+3]=g[3]}return f};a.snap=function(f,d,e,g){if("undefined"==typeof f||"undefined"==typeof d||"undefined"==typeof e||"undefined"==typeof g)d=f=0,e=a.settings.width,g=a.settings.height;return c.getContext("2d").getImageData(f,d,e,g)};a.save=function(a,d){"undefined"==typeof a&&(a="png");"undefined"==typeof d&&(d=1);return c.toDataURL("image/"+a,d)};(function(){a.settings=e.extend({},d,g);navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame;if(navigator.getUserMedia&&window.requestAnimationFrame){c.setAttribute("width",a.settings.width);c.setAttribute("height",a.settings.height);var f=document.createElement("video");f.setAttribute("autoplay","1");f.setAttribute("width",a.settings.width);f.setAttribute("height",a.settings.height);e(f).hide();c.parentNode.insertBefore(f,c.nextSibling);m(f)}else"function"==typeof a.settings.unsupported&&a.settings.unsupported()})()};e.fn.instacam=function(c){var g=e(this).data("instacam");if(void 0===g)return this.each(function(){var a=new e.instacam(this,c);e(this).data("instacam",a)});if("object"==typeof c)e.each(c,function(a,c){g.settings[a]=c});else return g.settings[c]}})(jQuery);
$(function() {
$('#canvas1').instacam();
var i = 0;
var snapshot;
recording = function() {
snapshot = window.setInterval(function() {
if (i <= 10) { // auto-off: set max value to prevent infinite record
var data = $('#canvas1').data('instacam').save('jpeg', '0.7');
var thumbnail = document.createElement('img');
thumbnail.setAttribute('width', $('#canvas1').instacam('width'));
thumbnail.setAttribute('height', $('#canvas1').instacam('height'));
thumbnail.setAttribute('src', data);
$('.thumb').append(thumbnail);
i=i+1;
snapshot();
}
}, 500);
}
$(".record").click(function() {
recording();
});
$(".pause").click(function() {
clearInterval(snapshot);
});
});
</script>
<script id="jsbin-source-html" type="text/html"><!DOCTYPE html>
<html>
<head>
<meta name="description" content="boilerplate widget factory">
<script src="//code.jquery.com/jquery.min.js"><\/script>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<h2>Save demo</h2>
<p>After allowing the webcam in your browser, click record to start recording. <strong>Enjoy!</strong><br/>
<button class="record">record</button>
<button class="pause">pause</button></p>
<canvas id="canvas1"></canvas>
<br />
<form>
<div>
Format:<label><input type="radio" name="format" value="png" />png</label>
<label><input type="radio" name="format" value="jpeg" checked="checked" />jpeg</label>
<label><input type="radio" name="format" value="webp" />webp</label>
</div>
<div class="quality">
Quality:<label><input type="radio" name="quality" value="0.1" />poor (0.1)</label>
<label><input type="radio" name="quality" value="0.3" />low (0.3)</label>
<label><input type="radio" name="quality" value="0.7" checked="checked" />middle (0.7)</label>
<label><input type="radio" name="quality" value="1" />good (1)</label>
</div>
<div>
Estimated filesize: <em class="filesize">*</em>
</div>
</form>
<div class="thumb"></div>
<blockquote class="log"></blockquote>
</body>
</html></script>
<script id="jsbin-source-javascript" type="text/javascript">
(function(e){e.instacam=function(c,g){var a=this,d={width:400,height:300,sound:!1,opacity:1,brightness:1,contrast:1,saturation:0,hue:0,invert:0,grayscale:0,sepia:0,blur:0,url:"",filter:null,done:null,fail:null,unsupported:null},m=function(f){try{navigator.getUserMedia({video:!0,audio:a.settings.sound},function(k){f.src=window.URL.createObjectURL(k);var h=function(){requestAnimationFrame(h);"function"!=typeof a.settings.filter?c.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height):("undefined"==typeof a.buffer&&(a.buffer=document.createElement("canvas"),a.buffer.setAttribute("width",a.settings.width),a.buffer.setAttribute("height",a.settings.height),c.parentNode.insertBefore(a.buffer,c.nextSibling),e(a.buffer).hide()),a.buffer.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height),c.getContext("2d").putImageData(l(a.buffer.getContext("2d").getImageData(0,0,a.settings.width,a.settings.height)),0,0));var b=a.settings.opacity!=d.opacity?"opacity("+a.settings.opacity+") ":"",b=b+(a.settings.brightness!=d.brightness?"brightness("+a.settings.brightness+") ":""),b=b+(a.settings.contrast!=d.contrast?"contrast("+a.settings.contrast+") ":""),b=b+(a.settings.saturation!=d.saturation?"saturate("+a.settings.saturation+") ":""),b=b+(a.settings.hue!=d.hue?"hue-rotate("+a.settings.hue+"deg) ":""),b=b+(a.settings.invert!=d.invert?"invert("+a.settings.invert+") ":""),b=b+(a.settings.grayscale!=d.grayscale?"grayscale("+a.settings.grayscale+") ":""),b=b+(a.settings.sepia!=d.sepia?"sepia("+a.settings.sepia+") ":""),b=b+(a.settings.blur!=d.blur?"blur("+a.settings.blur+"px) ":""),b=b+(a.settings.url!=d.url?"url("+a.settings.url+") ":"");""!==b&&a.css!=b&&(e(c).css({filter:b,"-webkit-filter":b}),a.css=b);""===b&&(e(c).css({filter:"","-webkit-filter":""}),a.css="")};requestAnimationFrame(h);"function"==typeof a.settings.done&&a.settings.done(f,c)},function(){"function"==typeof a.settings.fail&&a.settings.fail(f,c)})}catch(k){"function"==typeof a.settings.fail&&a.settings.fail(f,c)}},l=function(f){for(var c=f.data,d=0;d<a.settings.height;d++)for(var e=0;e<a.settings.width;e++){var b=4*(a.settings.width*d+e),g=a.settings.filter({offset:b,x:e,y:d,red:c[b],green:c[b+1],blue:c[b+2],alpha:c[b+3]});c[b]=g[0];c[b+1]=g[1];c[b+2]=g[2];c[b+3]=g[3]}return f};a.snap=function(f,d,e,g){if("undefined"==typeof f||"undefined"==typeof d||"undefined"==typeof e||"undefined"==typeof g)d=f=0,e=a.settings.width,g=a.settings.height;return c.getContext("2d").getImageData(f,d,e,g)};a.save=function(a,d){"undefined"==typeof a&&(a="png");"undefined"==typeof d&&(d=1);return c.toDataURL("image/"+a,d)};(function(){a.settings=e.extend({},d,g);navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame;if(navigator.getUserMedia&&window.requestAnimationFrame){c.setAttribute("width",a.settings.width);c.setAttribute("height",a.settings.height);var f=document.createElement("video");f.setAttribute("autoplay","1");f.setAttribute("width",a.settings.width);f.setAttribute("height",a.settings.height);e(f).hide();c.parentNode.insertBefore(f,c.nextSibling);m(f)}else"function"==typeof a.settings.unsupported&&a.settings.unsupported()})()};e.fn.instacam=function(c){var g=e(this).data("instacam");if(void 0===g)return this.each(function(){var a=new e.instacam(this,c);e(this).data("instacam",a)});if("object"==typeof c)e.each(c,function(a,c){g.settings[a]=c});else return g.settings[c]}})(jQuery);
$(function() {
$('#canvas1').instacam();
var i = 0;
var snapshot;
recording = function() {
snapshot = window.setInterval(function() {
if (i <= 10) { // auto-off: set max value to prevent infinite record
var data = $('#canvas1').data('instacam').save('jpeg', '0.7');
var thumbnail = document.createElement('img');
thumbnail.setAttribute('width', $('#canvas1').instacam('width'));
thumbnail.setAttribute('height', $('#canvas1').instacam('height'));
thumbnail.setAttribute('src', data);
$('.thumb').append(thumbnail);
i=i+1;
snapshot();
}
}, 500);
}
$(".record").click(function() {
recording();
});
$(".pause").click(function() {
clearInterval(snapshot);
});
});</script></body>
</html>
(function(e){e.instacam=function(c,g){var a=this,d={width:400,height:300,sound:!1,opacity:1,brightness:1,contrast:1,saturation:0,hue:0,invert:0,grayscale:0,sepia:0,blur:0,url:"",filter:null,done:null,fail:null,unsupported:null},m=function(f){try{navigator.getUserMedia({video:!0,audio:a.settings.sound},function(k){f.src=window.URL.createObjectURL(k);var h=function(){requestAnimationFrame(h);"function"!=typeof a.settings.filter?c.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height):("undefined"==typeof a.buffer&&(a.buffer=document.createElement("canvas"),a.buffer.setAttribute("width",a.settings.width),a.buffer.setAttribute("height",a.settings.height),c.parentNode.insertBefore(a.buffer,c.nextSibling),e(a.buffer).hide()),a.buffer.getContext("2d").drawImage(f,0,0,a.settings.width,a.settings.height),c.getContext("2d").putImageData(l(a.buffer.getContext("2d").getImageData(0,0,a.settings.width,a.settings.height)),0,0));var b=a.settings.opacity!=d.opacity?"opacity("+a.settings.opacity+") ":"",b=b+(a.settings.brightness!=d.brightness?"brightness("+a.settings.brightness+") ":""),b=b+(a.settings.contrast!=d.contrast?"contrast("+a.settings.contrast+") ":""),b=b+(a.settings.saturation!=d.saturation?"saturate("+a.settings.saturation+") ":""),b=b+(a.settings.hue!=d.hue?"hue-rotate("+a.settings.hue+"deg) ":""),b=b+(a.settings.invert!=d.invert?"invert("+a.settings.invert+") ":""),b=b+(a.settings.grayscale!=d.grayscale?"grayscale("+a.settings.grayscale+") ":""),b=b+(a.settings.sepia!=d.sepia?"sepia("+a.settings.sepia+") ":""),b=b+(a.settings.blur!=d.blur?"blur("+a.settings.blur+"px) ":""),b=b+(a.settings.url!=d.url?"url("+a.settings.url+") ":"");""!==b&&a.css!=b&&(e(c).css({filter:b,"-webkit-filter":b}),a.css=b);""===b&&(e(c).css({filter:"","-webkit-filter":""}),a.css="")};requestAnimationFrame(h);"function"==typeof a.settings.done&&a.settings.done(f,c)},function(){"function"==typeof a.settings.fail&&a.settings.fail(f,c)})}catch(k){"function"==typeof a.settings.fail&&a.settings.fail(f,c)}},l=function(f){for(var c=f.data,d=0;d<a.settings.height;d++)for(var e=0;e<a.settings.width;e++){var b=4*(a.settings.width*d+e),g=a.settings.filter({offset:b,x:e,y:d,red:c[b],green:c[b+1],blue:c[b+2],alpha:c[b+3]});c[b]=g[0];c[b+1]=g[1];c[b+2]=g[2];c[b+3]=g[3]}return f};a.snap=function(f,d,e,g){if("undefined"==typeof f||"undefined"==typeof d||"undefined"==typeof e||"undefined"==typeof g)d=f=0,e=a.settings.width,g=a.settings.height;return c.getContext("2d").getImageData(f,d,e,g)};a.save=function(a,d){"undefined"==typeof a&&(a="png");"undefined"==typeof d&&(d=1);return c.toDataURL("image/"+a,d)};(function(){a.settings=e.extend({},d,g);navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame;if(navigator.getUserMedia&&window.requestAnimationFrame){c.setAttribute("width",a.settings.width);c.setAttribute("height",a.settings.height);var f=document.createElement("video");f.setAttribute("autoplay","1");f.setAttribute("width",a.settings.width);f.setAttribute("height",a.settings.height);e(f).hide();c.parentNode.insertBefore(f,c.nextSibling);m(f)}else"function"==typeof a.settings.unsupported&&a.settings.unsupported()})()};e.fn.instacam=function(c){var g=e(this).data("instacam");if(void 0===g)return this.each(function(){var a=new e.instacam(this,c);e(this).data("instacam",a)});if("object"==typeof c)e.each(c,function(a,c){g.settings[a]=c});else return g.settings[c]}})(jQuery);
$(function() {
$('#canvas1').instacam();
var i = 0;
var snapshot;
recording = function() {
snapshot = window.setInterval(function() {
if (i <= 10) { // auto-off: set max value to prevent infinite record
var data = $('#canvas1').data('instacam').save('jpeg', '0.7');
var thumbnail = document.createElement('img');
thumbnail.setAttribute('width', $('#canvas1').instacam('width'));
thumbnail.setAttribute('height', $('#canvas1').instacam('height'));
thumbnail.setAttribute('src', data);
$('.thumb').append(thumbnail);
i=i+1;
snapshot();
}
}, 500);
}
$(".record").click(function() {
recording();
});
$(".pause").click(function() {
clearInterval(snapshot);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment