-
Notifications
You must be signed in to change notification settings - Fork 3
/
CamMan.min.js
1 lines (1 loc) · 3.98 KB
/
CamMan.min.js
1
var CamMan=function(){navigator.getUserMedia=function(){return navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia||!1}(),window.requestAnimationFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),window.URL=function(){return window.URL||window.webkitURL||!1}();var CamMan=function(options){return this.events={},this.snapshots=[],this.canvasStore=[],this.video=null,this.stream=null,this.options={audio:!1,container:null,resizeWidth:null,perFrameEvtPrefix:"canvas"},this.setOptions(options),this};return CamMan.prototype.createCanvas=function(resizeWidth){var canvas=null,width=resizeWidth||this.video.videoWidth,height=this.video.videoHeight/(this.video.videoWidth/width);return width&&height&&(canvas=document.createElement("canvas"),canvas.width=width,canvas.height=height,0===this.canvasStore.length&&this.updateCanvas(),this.canvasStore.push(canvas)),canvas},CamMan.prototype.getCanvas=function(options){var element=document.querySelector("#"+options.container);if(element){if(options.onFrame){var evtPrefix=this.options.perFrameEvtPrefix,eventName=evtPrefix+this.canvasStore.length;this.on(eventName,options.onFrame.bind(this))}return element.appendChild(this.createCanvas(options.resizeWidth))}},CamMan.prototype.updateCanvas=function(){for(var i=0;i<this.canvasStore.length;i++){var canvas=this.canvasStore[i],context=canvas.getContext("2d");context.drawImage(this.video,0,0,canvas.width,canvas.height),this.trigger(this.options.perFrameEvtPrefix+i,canvas)}requestAnimationFrame(this.updateCanvas.bind(this))},CamMan.prototype.on=function(event,handler){this.events.hasOwnProperty(event)||(this.events[event]=[]),this.events[event].push(handler)},CamMan.prototype.off=function(event,handler){this.events=this.events[event].filter(function(h){return h!==handler?h:void 0})},CamMan.prototype.trigger=function(event,data){return this.events.hasOwnProperty(event)?(this.events[event].forEach(function(handler){handler.call(this,data)}.bind(this)),void 0):!1},CamMan.prototype.setOptions=function(options){for(var option in options)this.options[option]=options[option]},CamMan.prototype.getStreamURL=function(){return window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(this.stream):this.stream},CamMan.prototype.createVideo=function(resizeWidth){var streaming=!1,video=document.createElement("video");return video.addEventListener("canplay",function(){if(!streaming){var width=resizeWidth||video.videoWidth,height=video.videoHeight/(video.videoWidth/width);return video.width=video.style.width=width,video.height=video.style.height=height,streaming=!0,video.play(),this.trigger("start")}}.bind(this),!1),navigator.mozGetUserMedia?video.mozSrcObject=this.stream:video.src=this.getStreamURL(),video},CamMan.prototype.snapshot=function(width,height){width=width||this.video.videoWidth,height=height||this.video.videoHeight;var canvas=document.createElement("canvas"),context=canvas.getContext("2d");return canvas.width=width,canvas.height=height,context.drawImage(this.video,0,0,width,height),this.snapshots.push(canvas),this.trigger("snapshot",canvas),context=null,canvas},CamMan.prototype.start=function(){if(!navigator.getUserMedia)return this.trigger("error","Browser not supported"),!1;var success=function(stream){this.stream=stream,this.video=this.createVideo(this.options.resizeWidth);var container=this.options.container;if("string"==typeof container){var element=document.querySelector("#"+container);element.appendChild(this.video)}}.bind(this),error=function(err){this.trigger("error",err)}.bind(this),options={video:!0,audio:this.options.audio};return navigator.getUserMedia(options,success,error)},CamMan.prototype.stop=function(){return this.stream.stop(),window.URL&&window.URL.revokeObjectURL&&window.URL.revokeObjectURL(this.video.src),this.canvasStore.length=0,this.trigger("stop")},CamMan}();