|
18 | 18 | } |
19 | 19 | </style> |
20 | 20 | <div style="display:flex;background-color:navy;color:white;padding:10px;"> |
21 | | - <div>🧊 NumberCooler Recorder</div> |
| 21 | + <div>🧊 NumberCooler Recorder Premium</div> |
22 | 22 | </div> |
23 | 23 | <div id="main" style="display:flex;padding:0px;border-left:solid 10px navy;border-right:solid 10px navy;"> |
24 | 24 | <div id="listPanel" style="flex:0.6;overflow:auto;"> |
|
77 | 77 | <button id="btnRecord">Start Recording</button> |
78 | 78 | <button id="btnPlay">play</button> |
79 | 79 | <button id="btnDownloadMovie">download movie</button> |
80 | | - <button id="btnDownloadPicture">download picture</button> |
81 | 80 | <button id="btnNext">change canvas</button> |
82 | 81 | </div> |
83 | 82 | <div> |
|
245 | 244 | let audioStream0 = null; |
246 | 245 | let audioStream1 = null; |
247 | 246 |
|
248 | | - |
| 247 | +console.log(navigator); |
249 | 248 | var stream0 = await navigator.mediaDevices.getUserMedia({video:true,audio:true}); |
250 | 249 | stream0.getTracks().forEach(function(track) { |
251 | 250 | track.stop(); |
|
593 | 592 | log('Recorded Blobs: '+ recordedBlobs.length); |
594 | 593 | playscreen.el.controls = true; |
595 | 594 | } |
596 | | -function download() { |
597 | | - const blob = new Blob(recordedBlobs, {type: 'video/webm'}); |
598 | | - const url = window.URL.createObjectURL(blob); |
| 595 | +async function download() { |
| 596 | + var nblob = await makeNcpBlob(recordedBlobs); |
| 597 | + const url = window.URL.createObjectURL(nblob); |
599 | 598 | const a = document.createElement('a'); |
600 | 599 | a.style.display = 'none'; |
601 | 600 | a.href = url; |
602 | | - a.download = 'test.webm'; |
| 601 | + a.download = 'last_record.ncp'; |
603 | 602 | document.body.appendChild(a); |
604 | 603 | a.click(); |
605 | 604 | setTimeout(() => { |
606 | 605 | document.body.removeChild(a); |
607 | 606 | window.URL.revokeObjectURL(url); |
608 | | - }, 100); |
| 607 | + }, 10000); |
609 | 608 | } |
610 | 609 |
|
611 | 610 | btnRecord.el.addEventListener("click",()=>{ toggleRecording(); }); |
|
698 | 697 | schema2.el.sc.scrollIntoView({block:"center"}); |
699 | 698 | schema2.exports.ncp.control.el.play(); |
700 | 699 | if( schema2.exports.ncp.spec.type == "audio.webm" ) { |
701 | | - |
| 700 | + |
702 | 701 | } else if(schema2.exports.ncp.spec.type == "video.webm") { // video tag, expecting bad margin, 100% width is custom |
703 | 702 | schema2.exports.ncp.control.el.style.width = "100%"; |
704 | 703 | schema2.exports.ncp.control.el.style.marginBottom = "-7px"; |
|
731 | 730 | .send(); |
732 | 731 | } |
733 | 732 | refresh_list(); |
734 | | - |
| 733 | + |
| 734 | + |
| 735 | + |
| 736 | +window.audio_mix = async ()=>{ |
| 737 | + |
| 738 | + var audio = new AudioContext(); |
| 739 | + |
| 740 | + // load begin |
| 741 | + var data = await fetch(`/sample.mp3`); |
| 742 | + var buffer = await data.arrayBuffer(); |
| 743 | + var bufferSource = await audio.decodeAudioData(buffer); |
| 744 | + // load end |
| 745 | + |
| 746 | + var mixer = audio.createMediaStreamDestination(); |
| 747 | + var player = new Audio(); |
| 748 | + |
| 749 | + // load mic begin |
| 750 | + var micStream = await navigator.mediaDevices.getUserMedia({audio:true}); |
| 751 | + // load mic end |
| 752 | + |
| 753 | + var microphone = audio.createMediaStreamSource(micStream); |
| 754 | + var microphoneGain = audio.createGain(); |
| 755 | + microphone.connect(microphoneGain); |
| 756 | + microphoneGain.gain.value = 0.5; |
| 757 | + |
| 758 | + var playback = audio.createBufferSource(); |
| 759 | + var playbackGain = audio.createGain(); |
| 760 | + playback.buffer = bufferSource; |
| 761 | + playback.connect(playbackGain); |
| 762 | + playbackGain.gain.value = 0.5; |
| 763 | + |
| 764 | + // play of audio playback |
| 765 | + playback.start(); |
| 766 | + playbackGain.connect(audio.destination); |
| 767 | + |
| 768 | + microphoneGain.connect(mixer); |
| 769 | + playbackGain.connect(mixer); |
| 770 | + // return of microphone |
| 771 | + //microphone.connect(audio.destination); |
| 772 | + |
| 773 | + var mediaRecorder = new MediaRecorder(mixer.stream,{mimeType : 'audio/webm'}); |
| 774 | + var chunks = []; |
| 775 | + mediaRecorder.start(1); |
| 776 | + mediaRecorder.ondataavailable = function (event) { |
| 777 | + if (event.data && event.data.size > 0) { |
| 778 | + chunks.push(event.data); |
| 779 | + } |
| 780 | + } |
| 781 | + mediaRecorder.onstop = function(event) { |
| 782 | + var player = new Audio(); |
| 783 | + player.controls = "controls"; |
| 784 | + var blob = new Blob(chunks, { "type": "audio/webm" }); |
| 785 | + audioDownload = URL.createObjectURL(blob); |
| 786 | + var player = new Audio(); |
| 787 | + player.src = audioDownload; |
| 788 | + player.play(); |
| 789 | + }; |
| 790 | + |
| 791 | + setTimeout(()=>{ |
| 792 | + micStream.getTracks().forEach(function(track) { |
| 793 | + track.stop(); |
| 794 | + }); |
| 795 | + playback.stop(); |
| 796 | + mediaRecorder.stop(); |
| 797 | + audio.close(); |
| 798 | + },10000); |
| 799 | + |
| 800 | +} |
| 801 | + |
735 | 802 | </script> |
0 commit comments