マイクから録音、再生する
「マイクの使用を開始」ボタンを押すと、マイクをアクティブにします。
次に「録音の開始」ボタンを押すと録音を開始します。
(参考)MediaRecorderを使うとデータを圧縮できますが、コーデック形式はブラウザ毎に異なります
-
- Firefox
- audio/ogg; codecs=opus
-
- Chrome,Edge(Chromeベース)
- audio/webm;codecs=opus
-
- Safari(iOS 14.3以降のみ)
- audio/mp4
ソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=0.1, maximum-scale=4,user-scalable=yes"> <script> var TMamMicRec=function(control,micOnBtn,recStartBtn,recStopBtn,recMime){ this.control=control; this.micOnBtn =micOnBtn; this.recStartBtn=recStartBtn; this.recStopBtn =recStopBtn; this.recMime = recMime; this.stream=null; this.mediaRecorder=null; this.chunks=[]; this.recStartBtn.setAttribute("disabled",true); this.recStopBtn.setAttribute("disabled",true); this.type=null; this.micOnBtn.addEventListener("click",function(){ if(navigator.mediaDevices==undefined){ alert('未対応ブラウザ 又は HTTPS接続していません'); return; } navigator.mediaDevices.getUserMedia({audio:true}) .then(function(stream){ this.stream=stream; this.mediaRecorder=new MediaRecorder(this.stream); this.mediaRecorder.addEventListener("dataavailable",function(event){ this.chunks.push(event.data); console.log(event.data); }.bind(this)); this.mediaRecorder.addEventListener("stop",function(e){ // audio/webm;codecs=opus audio/ogg; codecs=opus this.type=this.chunks[0].type; this.recMime.innerHTML=this.type; let blob=new Blob(this.chunks,{"type":this.type}); this.chunks=[]; /* //ファイルのダウンロードを行う場合 let aTag=document.createElement("a"); aTag.href=URL.createObjectURL(blob); aTag.download="a.mp4"; aTag.click(); */ /* //DataURI変換して<input type="hidden">のvalueに入れてPOSTでサーバーに送る場合 let fileReaderPost=new FileReader(); fileReaderPost.addEventListener("load",function(event){ let formTag=document.createElement('form'); formTag.method="get"; formTag.action="post.php";//POST先URL let inputTag=document.createElement('input'); inputTag.type="hidden"; inputTag.name="record";//POST時の名前 inputTag.value=event.target.result;//POST時の値 formTag.appendChild(inputTag); this.control.appendChild(formTag); formTag.submit();//POST実行する }.bind(this)); fileReaderPost.readAsDataURL(blob); */ //録音したblobをDataURIスキームに変換して<audio>タグでそのまま再生する場合 let fileReaderAudio=new FileReader(); fileReaderAudio.addEventListener("load",function(event){ let audio_play=document.body.querySelector("#audio_play"); if(audio_play==null){ audio_play=document.createElement("audio"); audio_play.setAttribute("controls","true"); audio_play.setAttribute("id","audio_play"); audio_play.setAttribute("playsinline",""); this.control.appendChild(audio_play); //document.getElementById("Control").appendChild(audio_play); }else{ audio_play.pause(); audio_play.currentTime=0; } audio_play.setAttribute("src",event.target.result); //audio_play.src=this.result; audio_play.load(); audio_play.play(); }.bind(this)); fileReaderAudio.readAsDataURL(blob); this.recStartBtn.removeAttribute("disabled"); this.recStopBtn.setAttribute("disabled",true); }.bind(this)); this.recStartBtn.removeAttribute("disabled"); this.micOnBtn.setAttribute("disabled",true); }.bind(this)).catch(function(e){ console.log(e); document.getElementById("alert").innerHTML=e; }.bind(this)); }.bind(this)); this.recStartBtn.addEventListener("click",function(){ this.recStartBtn.setAttribute("disabled", true); this.recStopBtn.removeAttribute("disabled"); this.mediaRecorder.start(); }.bind(this)); this.recStopBtn.addEventListener("click",function(){ this.mediaRecorder.stop(); }.bind(this)); } window.addEventListener("DOMContentLoaded",function(){ mamMicRec=new TMamMicRec( document.getElementById("Control"), document.getElementById("MicOn"), document.getElementById("RecStart"), document.getElementById("RecStop"), document.getElementById("RecMime") ); }); </script> </head> <body> <div id="Control"> <button id="MicOn">マイクの使用を開始</button><br/> <button id="RecStart">録音開始</button> <button id="RecStop" disabled>録音終了</button><br> <div id="RecMime"></div> </div> </body> </html>