1
+ let video = document . querySelector ( "video" ) ;
2
+
3
+ let constraints = {
4
+ video : true ,
5
+ audio : true
6
+ } ;
7
+
8
+ let mediaRecorder ;
9
+ let buffer = [ ] ;
10
+
11
+ let recordState = false ;
12
+
13
+ let videoRecorder = document . querySelector ( "#record-video" ) ;
14
+ let captureButton = document . querySelector ( "#click-image" ) ;
15
+
16
+ let timingELem = document . querySelector ( ".timing" ) ;
17
+ let clearObj ;
18
+
19
+ let allFilters = document . querySelectorAll ( ".filter" ) ;
20
+ let uiFilter = document . querySelector ( ".ui-filter" ) ;
21
+
22
+ let zoomIn = document . querySelector ( ".fa-plus" ) ;
23
+ let zoomOut = document . querySelector ( ".fa-minus" ) ;
24
+
25
+ let scale = 1.0 ;
26
+
27
+ // Video recorder listeners
28
+ navigator . mediaDevices
29
+ . getUserMedia ( constraints )
30
+ . then ( function ( mediaStream ) {
31
+ video . srcObject = mediaStream ;
32
+
33
+ mediaRecorder = new MediaRecorder ( mediaStream ) ;
34
+ mediaRecorder . addEventListener ( 'dataavailable' , function ( e ) {
35
+ buffer . push ( e . data ) ;
36
+ } ) ;
37
+ mediaRecorder . addEventListener ( 'stop' , function ( ) {
38
+ let blob = new Blob ( buffer , { type : "video/mp4" } ) ;
39
+ const url = window . URL . createObjectURL ( blob ) ;
40
+ let a = document . createElement ( "a" ) ;
41
+ a . download = `VID_${ getTimeStamp ( ) } .mp4` ;
42
+ a . href = url ;
43
+ a . click ( ) ;
44
+ a . remove ( ) ;
45
+ addMediaToDB ( url , "videos" ) ;
46
+ buffer = [ ] ;
47
+ } ) ;
48
+ } ) . catch ( function ( err ) {
49
+ console . log ( err ) ;
50
+ } ) ;
51
+
52
+ // Recording Video
53
+ videoRecorder . addEventListener ( 'click' , function ( ) {
54
+ if ( ! mediaRecorder ) {
55
+ alert ( "Permissions not given" ) ;
56
+ return ;
57
+ }
58
+ if ( ! recordState ) {
59
+ mediaRecorder . start ( ) ;
60
+ videoRecorder . style . animation = "buttonAnimation 0.75s infinite" ;
61
+ recordState = true ;
62
+ startClock ( ) ;
63
+ } else {
64
+ mediaRecorder . stop ( ) ;
65
+ videoRecorder . style . animation = "none" ;
66
+ recordState = false ;
67
+ stopClock ( ) ;
68
+ }
69
+ } ) ;
70
+
71
+ // Capturing Image
72
+ captureButton . addEventListener ( "click" , function ( ) {
73
+ if ( ! mediaRecorder ) {
74
+ alert ( "Permissions not given" ) ;
75
+ return ;
76
+ }
77
+ // Create a canvas element equal to video frame
78
+ let canvas = document . createElement ( "canvas" ) ;
79
+ canvas . width = video . videoWidth ;
80
+ canvas . height = video . videoHeight ;
81
+ let tool = canvas . getContext ( "2d" ) ;
82
+ // Zoom from center
83
+ tool . scale ( scale , scale ) ;
84
+ let x = ( tool . canvas . width / scale - video . videoWidth ) / 2 ;
85
+ let y = ( tool . canvas . height / scale - video . videoHeight ) / 2 ;
86
+ // Draw a frame on that canvas
87
+ tool . drawImage ( video , x , y ) ;
88
+ // translucent
89
+ tool . globalAlpha = 0.25 ;
90
+ tool . fillStyle = getFilter ( document . querySelector ( ".ui-filter" ) . classList [ 1 ] ) ;
91
+ // things are drawn on above layer
92
+ tool . fillRect ( 0 , 0 , canvas . width , canvas . height ) ;
93
+ // toDataUrl
94
+ let link = canvas . toDataURL ( ) ;
95
+ // Download
96
+ let anchor = document . createElement ( "a" ) ;
97
+ anchor . href = link ;
98
+ anchor . download = `IMG_${ getTimeStamp ( ) } .png` ;
99
+ anchor . click ( ) ;
100
+ anchor . remove ( ) ;
101
+ canvas . remove ( ) ;
102
+ addMediaToDB ( link , "images" ) ;
103
+ captureButton . style . animation = "buttonAnimation 0.5s 1" ;
104
+ setTimeout ( ( ) => {
105
+ captureButton . style . animation = "none" ;
106
+ } , 1000 ) ;
107
+ } ) ;
108
+
109
+ // Get current time stamp for file name
110
+ function getTimeStamp ( ) {
111
+ return new Date ( ) . getTime ( ) ;
112
+ }
113
+
114
+ // Filter helper
115
+ function getFilter ( filter ) {
116
+ switch ( filter ) {
117
+ case "filter-1" : return "#cc3838ad" ;
118
+ case "filter-2" : return "#0fbbbbad" ;
119
+ case "filter-3" : return "#8ddb18ad" ;
120
+ case "filter-4" : return "#ee82eead" ;
121
+ case "filter-5" : return "#b8870bad" ;
122
+ case "filter-6" : return "#ffffff00" ;
123
+ }
124
+ }
125
+
126
+ // Video Recorder Timers
127
+ function startClock ( ) {
128
+ timingELem . classList . add ( "timing-active" ) ;
129
+ let timeCount = 0 ;
130
+ clearObj = setInterval ( function ( ) {
131
+ let seconds = ( timeCount % 60 ) < 10 ? `0${ timeCount % 60 } ` : `${ timeCount % 60 } ` ;
132
+ let minutes = ( timeCount / 60 ) < 10 ? `0${ Number . parseInt ( timeCount / 60 ) } ` : `${ Number . parseInt ( timeCount / 60 ) } ` ;
133
+ let hours = ( timeCount / 3600 ) < 10 ? `0${ Number . parseInt ( timeCount / 3600 ) } ` : `${ Number . parseInt ( timeCount / 3600 ) } ` ;
134
+ timingELem . innerText = `${ hours } :${ minutes } :${ seconds } ` ;
135
+ timeCount ++ ;
136
+ } , 1000 ) ;
137
+ }
138
+ function stopClock ( ) {
139
+ timingELem . classList . remove ( "timing-active" ) ;
140
+ timingELem . innerText = "00:00:00" ;
141
+ clearInterval ( clearObj ) ;
142
+ }
143
+
144
+ // Filter apply
145
+ for ( let i = 0 ; i < allFilters . length ; i ++ ) {
146
+ allFilters [ i ] . addEventListener ( "click" , function ( ) {
147
+ uiFilter . classList . remove ( uiFilter . classList [ 1 ] ) ;
148
+ uiFilter . classList . add ( allFilters [ i ] . classList [ 1 ] ) ;
149
+ } )
150
+ }
151
+
152
+ // Zoom apply
153
+ zoomIn . addEventListener ( "click" , function ( ) {
154
+ if ( scale > 1.9 )
155
+ return ;
156
+ scale += 0.1 ;
157
+ // -x for mirroring
158
+ video . style . transform = `scale(-${ scale } , ${ scale } )` ;
159
+ } )
160
+ zoomOut . addEventListener ( "click" , function ( ) {
161
+ if ( scale < 0.5 )
162
+ return ;
163
+ scale -= 0.1 ;
164
+ // -x for mirroring
165
+ video . style . transform = `scale(-${ scale } , ${ scale } )` ;
166
+ } )
0 commit comments