Skip to content

Commit f5c2829

Browse files
committed
empty signals for canvas, and audio, same re-record, more stability
1 parent 3efae4c commit f5c2829

File tree

1 file changed

+122
-38
lines changed

1 file changed

+122
-38
lines changed

public/app.html

Lines changed: 122 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,15 @@
110110
<div id="chkCanvas" style="display:none;padding:5px;background-color:gainsboro;border-radius:20px;padding-left:15px;padding-right:15px;margin-right:10px;">🔴 Canvas</div>
111111
</div>
112112
<div id="mockHolder"></div>
113-
<div>
113+
<div id="recordHolder">
114114
<Component id="mic_holder"></Component>
115115
<Component id="mic_holder2"></Component>
116116
<Component id="camera_holder"></Component>
117117
<canvas id="canvas_screen"></canvas>
118118
</div>
119+
119120
<div id="playholder" style="display:none;">
121+
<div>🔵 Last Record</div>
120122
<video id="playscreen"></video>
121123
<Component id="playaudio"></Component>
122124
</div>
@@ -155,6 +157,7 @@
155157
},
156158
stream : null,
157159
tracks : [],
160+
recordType : "none",
158161
video : {
159162
mode : "none"
160163
},
@@ -190,7 +193,7 @@
190193
}
191194
//canvas
192195

193-
canvas_screen.el.style.display = "none";
196+
194197

195198
canvas_screen.el.style.width = "640px";
196199
canvas_screen.el.style.height = "480px";
@@ -215,8 +218,6 @@
215218
ctx.fill();
216219

217220
var cstate = 0;
218-
219-
220221
btnNext.el.addEventListener("click",()=>{
221222
switch(cstate%3) {
222223
case 0:
@@ -270,10 +271,40 @@
270271
}
271272
cstate++;
272273
})
274+
canvas_screen.el.style.display = "none";
273275

274276

277+
var cstate1 = 0;
278+
setInterval(()=>{ // like ping, to record something even if is a picture
279+
if(self.app.video.mode == "canvas" || self.app.video.mode == "play") {
280+
//console.log("OK");
281+
if(cstate1==0) {
282+
ctx.fillStyle = "#000";
283+
ctx.strokeStyle = "#00f";
284+
ctx.beginPath();
285+
ctx.moveTo(0, 479);
286+
ctx.lineTo(639, 479);
287+
ctx.closePath();
288+
ctx.stroke();
289+
cstate1 = 1;
290+
} else if(cstate1==1) {
291+
ctx.fillStyle = "#001";
292+
ctx.strokeStyle = "#f00";
293+
ctx.beginPath();
294+
ctx.moveTo(0, 479);
295+
ctx.lineTo(479, 639);
296+
ctx.closePath();
297+
ctx.stroke();
298+
cstate1 = 0;
299+
}
300+
}
301+
},10);
302+
275303
// devices
276-
self.app.stream = stream = canvas_screen.el.captureStream(32); // frames per second
304+
//self.app.stream = stream = canvas_screen.el.captureStream(32); // frames per second
305+
var stream = null;
306+
self.app.stream = null;
307+
277308

278309
let audioStream0 = null;
279310

@@ -388,6 +419,10 @@
388419
chkCanvas.el.style.display = "none";
389420
chkCamera.el.style.display = "";
390421

422+
if(self.app.video.mode == "play") {
423+
recordHolder.el.style.display = "";
424+
playscreen.el.style.display = "none";
425+
}
391426
self.app.video.mode = "camera";
392427

393428
canvas_screen.el.style.display = "none";
@@ -413,21 +448,33 @@
413448

414449
btnSetCanvas.el.addEventListener("click",()=>{
415450

451+
// CANVAS WILL NOT RECORD FIRST FRAME IF YOU DOWN CHANGE THE CONTENT OF CANVAS AT LEAST ONE TIME
452+
416453
chkScreen.el.style.display = "none";
417454
chkCanvas.el.style.display = "";
418455
chkCamera.el.style.display = "none";
419456

420-
self.app.video.mode = "canvas";
421-
if(cameraDevice) {
457+
458+
if(cameraDevice) { // stop camera and screen
459+
console.log("CLEAR camera");
422460
cameraDevice.pause();
423461
stream.getTracks().forEach(function(track) {
424462
track.stop();
425463
});
426464
cameraDevice.style.display = "none";
427465
camera_holder.$.elementsClear();
428466
}
467+
468+
if(self.app.video.mode == "play") {
469+
recordHolder.el.style.display = "";
470+
playscreen.el.style.display = "none";
471+
}
472+
self.app.video.mode = "canvas";
429473
canvas_screen.el.style.display = "";
430-
stream = canvas_screen.el.captureStream(32);
474+
self.app.stream = stream = canvas_screen.el.captureStream(32);
475+
476+
477+
console.log(stream);
431478

432479
});
433480

@@ -437,7 +484,7 @@
437484
chkCamera.el.style.display = "none";
438485

439486
canvas_screen.el.style.display = "none";
440-
self.app.video.mode = "desktop";
487+
441488

442489
if(cameraDevice) {
443490
cameraDevice.pause();
@@ -448,6 +495,12 @@
448495
camera_holder.$.elementsClear();
449496
}
450497

498+
if(self.app.video.mode == "play") {
499+
recordHolder.el.style.display = "";
500+
playscreen.el.style.display = "none";
501+
}
502+
self.app.video.mode = "desktop";
503+
451504

452505
const constraints = {
453506
video: {
@@ -478,6 +531,15 @@
478531
} catch (error) {
479532
stream = schema.el.control.src = window.URL.createObjectURL(stream2);
480533
}
534+
535+
stream.getTracks().forEach((track)=>{
536+
track.onended = function(event) {
537+
log("end of screen capture");
538+
chkScreen.el.style.display = "none";
539+
stopRecording();
540+
}
541+
});
542+
481543
schema.el.control.play();
482544
cameraDevice = schema.el.control;
483545
});
@@ -487,6 +549,7 @@
487549
chkCanvas.el.style.display = "none";
488550
chkCamera.el.style.display = "none";
489551

552+
490553
if(cameraDevice) {
491554
cameraDevice.pause();
492555
stream.getTracks().forEach(function(track) {
@@ -495,6 +558,12 @@
495558
cameraDevice.style.display = "none";
496559
camera_holder.$.elementsClear();
497560
}
561+
562+
if(self.app.video.mode == "play") {
563+
recordHolder.el.style.display = "";
564+
playscreen.el.style.display = "none";
565+
}
566+
498567
self.app.video.mode = "none";
499568
camera_holder.$.elementsClear();
500569
playscreen.el.style.display = "none";
@@ -540,32 +609,32 @@
540609
function handleDataAvailable(event) {
541610

542611
if (event.data && event.data.size > 0) {
612+
console.log(event.data);
543613
recordedBlobs.push(event.data);
544614
} else {
545615
//console.log( mediaRecorder.requestData() );
546616
//console.log(event);
547617
}
548618
}
549619

620+
async function handlePause(event) {
621+
log('Recorder paused: ', event);
622+
}
550623
async function handleStop(event) {
551624
log('Recorder stopped: ', event);
625+
552626
if(self.app.video.mode == "none") {
553627
const superBuffer = new Blob(recordedBlobs, {type: 'audio/webm'});
554-
555628
var url = (window.URL || window.webkitURL).createObjectURL(superBuffer);
556-
557629
var schema = await playaudio.$.elementSetPacketAsync(`
558630
<audio id="audio" controls>
559631
<source src="`+url+`" type="audio/webm">
560632
Your browser does not support the audio tag.
561633
</audio>
562634
`);
563-
564635
self.app.audio.control = schema.el.audio;
565-
566636
self.app.events.off("hitTrack",self.app.events.hitTrack);
567637
delete self.app.events.hitTrack;
568-
569638
} else {
570639
const superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
571640
playscreen.el.src = window.URL.createObjectURL(superBuffer);
@@ -583,9 +652,12 @@
583652
throw new Error("(you must select some input device)");
584653
return;
585654
}
586-
655+
console.log("video mode",self.app.video.mode)
656+
console.log("audio mode",self.app.audio.mode)
657+
recordHolder.el.style.display = "";
587658
recordedBlobs = [];
588659

660+
589661
var audioCtx = new AudioContext();
590662
var audioMixer = audioCtx.createMediaStreamDestination();
591663

@@ -612,9 +684,15 @@
612684
}
613685
console.log("hit",self.app.tracks[n]);
614686
};
615-
//playback.start();
616687
self.app.events.on("hitTrack",self.app.events.hitTrack);
617688

689+
// null signal to record empty audio space if mic is not activated
690+
var nullSignal = audioCtx.createOscillator();
691+
nullSignal.type = 'sine';
692+
nullSignal.frequency.value = 440;
693+
var nullSignalGain = audioCtx.createGain();
694+
nullSignalGain.gain.value = -100;
695+
nullSignalGain.connect(audioMixer);
618696
}
619697

620698
// mixing audio and video
@@ -623,9 +701,17 @@
623701
.getAudioTracks()
624702
.forEach((audioTrack) => stream.addTrack(audioTrack));
625703
}
704+
705+
if(self.app.video.mode != "none") {
706+
self.app.recordType = "video";
707+
} else {
708+
self.app.recordType = "audio";
709+
}
626710

627711
var options = {};
628-
if(self.app.video.mode != "none") {
712+
if(self.app.recordType == "video") {
713+
714+
console.log("VIDEO RECORD TYPE");
629715
options.mimeType = 'video/webm';
630716
try {
631717
mediaRecorder = new MediaRecorder(stream, options);
@@ -670,23 +756,31 @@
670756
btnPlay.el.disabled = true;
671757
btnDownloadMovie.el.disabled = true;
672758
mediaRecorder.onstop = handleStop;
759+
mediaRecorder.onpause = handlePause;
673760
mediaRecorder.ondataavailable = handleDataAvailable;
674761
mediaRecorder.onerror = function(error) {
675762
console.log(error.name);
676763
console.log(error);
677764
}
678-
679-
680765
mediaRecorder.start();
681-
682-
766+
try {
767+
768+
} catch(e) {
769+
log("error on media recorder start");
770+
log(e.message);
771+
}
683772

684773

685774
log('MediaRecorder started' + mediaRecorder);
686775
}
687776

688777
function stopRecording() {
689-
mediaRecorder.stop();
778+
if(mediaRecorder.state != "inactive") {
779+
mediaRecorder.stop();
780+
} else { // user stopped sharing screen.
781+
self.app.video.mode = "none";
782+
chkScreen.el.style.display = "none";
783+
}
690784
log('Recorded Blobs: '+ recordedBlobs.length);
691785
playscreen.el.controls = true;
692786
}
@@ -707,29 +801,19 @@
707801

708802
btnRecord.el.addEventListener("click",()=>{ toggleRecording(); });
709803
btnPlay.el.addEventListener("click",()=>{
710-
playholder.el.style.display = "";
711-
712-
713-
if(cameraDevice) {
714-
cameraDevice.pause();
715-
stream.getTracks().forEach(function(track) {
716-
track.stop();
717-
});
718-
cameraDevice.style.display = "none";
719-
camera_holder.$.elementsClear();
720-
}
721-
camera_holder.$.elementsClear();
722804

723-
canvas_screen.el.style.display = "none";
724-
725-
if(self.app.video.mode == "none") {
805+
playholder.el.style.display = "";
806+
recordHolder.el.style.display = "none";
807+
if(self.app.recordType == "audio") {
726808
playscreen.el.style.display = "none";
727809
self.app.audio.control.play();
728-
} else {
810+
self.app.audio.mode = "play";
811+
} else if(self.app.recordType == "video") {
729812
playscreen.el.style.display = "";
730813
playaudio.$.elementsClear();
731814
playscreen.el.style.width = "100%";
732815
playscreen.el.play();
816+
self.app.video.mode = "play";
733817
}
734818
});
735819
btnDownloadMovie.el.addEventListener("click",()=>{ download(); });

0 commit comments

Comments
 (0)