トップへ(mam-mam.net/)

JavascriptでUSBカメラとマイクからビデオ録画

検索:

JavascriptでUSBカメラとマイクから音声付ビデオ録画を行う

Javascriptを使うとカメラやマイクに接続することができ、データを取得することができます。
以下を使うとカメラとマイクの使用許可を取得できます。小さい画像で録画したいので「出来れば320x240のサイズ」でお願いしています。
navigator.mediaDevices.getUserMedia({audio:true, video:{facingMode:"user",width:{ideal:320},height:{ideal:240}}})
使用許可が取得出来たらストリームを返してきます。
MediaRecorderのコンストラクタの引数にストリームを渡してインスタンスを作成します。
MediaRecorderオブジェクトのstart(ミリ秒を指定)メソッドで、指定したミリ秒録画されるごとにdataavailableイベントが発生してメディア(録画データ)を返してきます。
返してきたメディア(録画データ)を配列に追加していき、録画停止(recorder.stop)で、配列に保存しておいたメディアをダウンロードさせます。

実際のサンプル




デフォルトで「ミュート」設定になっています。(ミュートを解除すれば音が出ます)

ソースコード

<button id="start" onclick="startRecording()">録画開始</button><br>
<button id="stop" onclick="endRecording()" disabled>録画停止</button><br>
<video id="video" autoplay playsInline muted controls></video><br>
<a id="dl"></a>

<script>
var chunks,recorder;
function startRecording(){
  chunks=[];
  navigator.mediaDevices.getUserMedia({audio:true, video:{facingMode:"user",width:{ideal:320},height:{ideal:240}}}).then(
    function(stream){
      document.querySelector("#stop").removeAttribute("disabled");
      document.querySelector("#start").setAttribute("disabled","");
      recorder = new MediaRecorder(stream);
      recorder.ondataavailable = function(el){
        if (el.data.size>0){chunks.push(el.data)};
      }
      recorder.onstop = onStop;
      recorder.start(1000);//1000ミリ秒録画されるごとにdataavailableイベントが発生する
    }
  );
}
function endRecording(){
  if(recorder){recorder.stop();}
}
function onStop(){
  if (!chunks.length){return;}
  document.querySelector("#stop").setAttribute("disabled","");
  document.querySelector("#start").removeAttribute("disabled");
  var obj=new Blob(chunks,{type:recorder.mimeType});
  var dl=document.querySelector("#dl");
  dl.href=URL.createObjectURL(obj);
  if(recorder.mimeType.match(/x-matroska/)){
    dl.download="test.mkv";
  }else if(recorder.mimeType.match(/mp4/)){
    dl.download="test.mp4";
  }else if(recorder.mimeType.match(/mpg/)){
    dl.download="test.mpg";
  }else{
    dl.download="test.webm";
  }
  dl.innerHTML="ダウンロード("+dl.download+")";
  document.querySelector("#video").src=URL.createObjectURL(obj);
}
</script>