該当箇所のコード
index.js
function startRecorder() {
navigator.mediaDevices.getUserMedia(constrains)
.then(function (stream) {
recorder = new MediaRecorder(stream)
recorder.ondataavailable = function (e) {
console.log(e);
// id testを操作できるよう取得
var testvideo = document.getElementById('test')
// id testに属性を追加する
// https://developer.mozilla.org/ja/docs/Web/API/Element/setAttribute
testvideo.setAttribute('controls', '')
testvideo.setAttribute('width', width)
testvideo.setAttribute('height', height)
var outputdata = window.URL.createObjectURL(e.data)
record_data.push(e.data)
testvideo.src = outputdata
}
})
}
個別箇所の挙動
recorder = new MediaRecorder(stream)
- MediaStream(今回はカメラとマイク)を使用して得られた情報を記録するMediaStreamオブジェクトを作成する
- 引数のstreamとは、navigator.mediaDevices.getUserMedia() を使用して作成したストリームである
- 参考
recorder.ondataavailable = function (e) {
- Blob データが使用可能になったことに応じてコードを実行する
- =録画の終了ボタンを押下したタイミング
- 引数で渡されているeにBlob形式で映像データが入る
- 参考
var outputdata = window.URL.createObjectURL(e.data)
- メモリ上に存在しているBlobに結びつくオブジェクトURLを生成し、outputdataに代入している
- この場合のメモリ上とはユーザの使用している端末のメモリのことなので、このURLを他者に共有してもアクセスできない(他者の使用している端末のメモリにはファイルがないから)
- わからないこと
- windowの有無で表面上の挙動は変わらないが、生成されるオブジェクトURLが異なる
- 参考
Blobとは
- typeを持つバイナリデータ
- 巨大な画像、音声ファイル、動画ファイルなどを扱うことができる
URLとしてのBlob
- typeがあることによりblobをダウンロード/アップロード可能
- URL.createObjectURLを使用して端末のメモリに保存されたblobにアクセスが可能な一意のURLを生成できる
- メモリに存在するblobへのアクセスマッピングを行っている
- 生成したURLはブラウザを閉じるまで有効
- 逆に言えばブラウザを閉じるまではメモリに常駐し続けるのでURL.revokeObjectURLを使って明示的にメモリ解放する必要がある
- 参考