MediaStream åé² API
Baseline
åºãå©ç¨å¯è½
*
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2021å¹´4æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
* ãã®æ©è½ã®ä¸é¨ã¯ã対å¿ã¬ãã«ãç°ãªãå ´åãããã¾ãã
MediaStream åé² API (MediaStream Recording API) ã¯ãåã« Media Recording API ã¾ã㯠MediaRecorder API ã¨å¼ã°ãããã¨ãããã¾ãããã¡ãã£ã¢ãã£ããã£ã¨ã¹ããªã¼ã API ããã³ WebRTC API ã¨å¯æ¥ã«é¢ä¿ãã¦ãã¾ãã MediaStream åé² API ã使ç¨ããã¨ãMediaStream ãªãã¸ã§ã¯ãã¾ã㯠HTMLMediaElement ãªãã¸ã§ã¯ãã«ãã£ã¦çæããããã¼ã¿ãåæãå¦çãã¾ãã¯ãã£ã¹ã¯ã¸ã®ä¿åã®ããã«ãã£ããã£ãããã¨ãã§ãã¾ãã ã¾ããé©ãã»ã©ç°¡åã«ä½æ¥ã§ãã¾ãã
åºæ¬æ¦å¿µ
MediaStream åé² API ã¯ãMediaRecorder ã¨ãã 1 ã¤ã®ä¸»è¦ãªã¤ã³ã¿ã¼ãã§ã¤ã¹ã§æ§æããã¦ãããããã MediaStream ãããã¼ã¿ãåå¾ãã¦å¦çã®ããã«ã¦ã¼ã¶ã¼ã«é
ä¿¡ããã¨ãããã¹ã¦ã®ä½æ¥ãè¡ãã¾ãã ãã¼ã¿ã¯ãMediaRecorder ã®ä½ææã«ãã§ã«æå®ããå½¢å¼ã§ãä¸é£ã® dataavailable ã¤ãã³ãã«ãã£ã¦é
ä¿¡ããã¾ãã ãã®å¾ããã¼ã¿ãããã«å¦çããããå¿
è¦ã«å¿ãã¦ãã¡ã¤ã«ã«æ¸ãè¾¼ããã¨ãã§ãã¾ãã
åé²ããã»ã¹ã®æ¦è¦
ã¹ããªã¼ã ãåé²ï¼recordingãé²é³ãé²ç»ï¼ããããã»ã¹ã¯ç°¡åã§ãã
- ã¡ãã£ã¢ãã¼ã¿ã®ã½ã¼ã¹ã¨ãã¦æ©è½ãã
MediaStreamã¾ãã¯HTMLMediaElementï¼<audio>è¦ç´ ã¾ãã¯<video>è¦ç´ ã®å½¢å¼ï¼ãè¨å®ãã¾ãã - ã½ã¼ã¹ã¹ããªã¼ã ã¨å¿
è¦ãªãªãã·ã§ã³ï¼ã³ã³ããã¼ã® MIME ã¿ã¤ãããã©ãã¯ã®å¿
è¦ãªãããã¬ã¼ããªã©ï¼ãæå®ãã¦ã
MediaRecorderãªãã¸ã§ã¯ãã使ãã¾ãã ondataavailableã«dataavailableã¤ãã³ãã®ã¤ãã³ããã³ãã©ã¼ãè¨å®ãã¾ãã ãã¼ã¿ãå©ç¨å¯è½ã«ãªããã³ã«ãããå¼ã³åºããã¾ãã- ã½ã¼ã¹ã¡ãã£ã¢ãåçãããåç»ãé²ç»ããæºåãæ´ã£ããã
MediaRecorder.start()ãå¼ã³åºãã¦é²ç»ãéå§ãã¾ãã dataavailableã¤ãã³ããã³ãã©ã¼ã¯æºåãã§ãããã¼ã¿ããããã³ã«å¼ã°ãã¾ãã ã¤ãã³ãã¯ãdata屿§ãæã¡ããã®å¤ã¯ã¡ãã£ã¢ãã¼ã¿ãå«ãBlobã§ãã ããªãã¯dataavailableã¤ãã³ããçºçããããã¨ãã§ããããã«ãã£ã¦ææ°ã®ãµã¦ã³ããããªãã«å±ããã®ã§ãããããã£ã«ã¿ã¼ã«ããããããããä¿åããããããã¨ãã§ãã¾ãã- ã½ã¼ã¹ã¡ãã£ã¢ã®åçã忢ããã¨ãé²ç»ã¯èªåçã«åæ¢ãã¾ãã
MediaRecorder.stop()ãå¼ã³åºããã¨ã§ããã¤ã§ãé²ç»ã忢ã§ãã¾ãã
ã¡ã¢:
åé²ãããã¡ãã£ã¢ã®ã¹ã©ã¤ã¹ãå«ãåã
ã® Blob ã¯ãå¿
ãããåå¥ã«åçã§ããããã§ã¯ããã¾ããã åçããåã«ã¡ãã£ã¢ãçµã¿ç«ã¦ç´ãå¿
è¦ãããã¾ãã
åé²ä¸ã«åé¡ãçºçããå ´åã¯ã error ã¤ãã³ãã MediaRecorder ã«éããã¾ãã onerror ã¤ãã³ããã³ãã©ã¼ãè¨å®ãããã¨ã§ error ã¤ãã³ããç£è¦ã§ãã¾ãã
ããã§ã®ä¾ã§ã¯ã MediaStream ã®ã½ã¼ã¹ã¨ã㦠HTML ãã£ã³ãã¹ãå©ç¨ãã9 ç§å¾ã«é²ç»ã忢ãã¾ãã
const canvas = document.querySelector("canvas");
// Optional frames per second argument.
const stream = canvas.captureStream(25);
const recordedChunks = [];
console.log(stream);
const options = { mimeType: "video/webm; codecs=vp9" };
const mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();
function handleDataAvailable(event) {
console.log("data-available");
if (event.data.size > 0) {
recordedChunks.push(event.data);
console.log(recordedChunks);
download();
} else {
// â¦
}
}
function download() {
const blob = new Blob(recordedChunks, {
type: "video/webm",
});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = url;
a.download = "test.webm";
a.click();
window.URL.revokeObjectURL(url);
}
// demo: to download after 9sec
setTimeout((event) => {
console.log("stopping");
mediaRecorder.stop();
}, 9000);
ã¬ã³ã¼ãã¼ã®ç¶æ ã調ã¹ã¦å¶å¾¡ãã
MediaRecorder ãªãã¸ã§ã¯ãã®ããããã£ã使ç¨ãã¦åé²ããã»ã¹ã®ç¶æ
ãæ±ºå®ããããpause() ããã³ resume() ã¡ã½ããã使ç¨ãã¦ã½ã¼ã¹ã¡ãã£ã¢ã®åé²ã䏿忢ãããåéããããããã¨ãã§ãã¾ãã
ç¹å®ã® MIME ã¿ã¤ãããµãã¼ãããã¦ãããã©ããã確èªããå¿
è¦ãããå ´åã¯ããããå¯è½ã§ãã MediaRecorder.isTypeSupported() ãå¼ã³åºãã ãã§ãã
è¦è¾¼ã¿ãããå ¥åã½ã¼ã¹ã®èª¿æ»
ã«ã¡ã©ããã¤ã¯ã®å
¥åãåé²ãããã¨ãç®çã®å ´åã¯ãMediaRecorder ã®æ§ç¯ããã»ã¹ãéå§ããåã«ã使ç¨å¯è½ãªå
¥åæ©å¨ã調ã¹ã¦ãã ããã ãã®ããã«ã¯ãnavigator.mediaDevices.enumerateDevices() ãå¼ã³åºãã¦å©ç¨å¯è½ãªã¡ãã£ã¢æ©å¨ã®ãªã¹ããåå¾ããå¿
è¦ãããã¾ãã ãã®å¾ããã®ãªã¹ãã調ã¹ã¦è¦è¾¼ã¿ãããå
¥åã½ã¼ã¹ãç¹å®ããããã«å¿
è¦ãªåºæºã«åºã¥ãã¦ãªã¹ãããã£ã«ã¿ãªã³ã°ãããã¨ãã§ãã¾ãã
ãã®ã³ã¼ãã¹ããããã§ã¯ãenumerateDevices() ã使ç¨ãã¦ä½¿ç¨å¯è½ãªå
¥åæ©å¨ã調ã¹ãé³å£°å
¥åæ©å¨ã§ãããã®ãè¦ã¤ãã¦ã<option> è¦ç´ ã使ãããããå
¥åã½ã¼ã¹ããã«ã¼ã表ã <select> è¦ç´ ã«è¿½å ãã¾ãã
navigator.mediaDevices.enumerateDevices().then((devices) => {
devices.forEach((device) => {
const menu = document.getElementById("inputdevices");
if (device.kind === "audioinput") {
const item = document.createElement("option");
item.textContent = device.label;
item.value = device.deviceId;
menu.appendChild(item);
}
});
});
ããã¨åããããªã³ã¼ãã使ç¨ãã¦ãã¦ã¼ã¶ã¼ã使ç¨ãããæ©å¨ã®ã»ãããå¶éãããã¨ãã§ãã¾ãã
詳細ã«ã¤ãã¦ã¯
MediaStream åé² API ã®ä½¿ç¨æ¹æ³ã®è©³ç´°ã«ã¤ãã¦ã¯ãMediaStream åé² API ã®ä½¿ç¨ãåç
§ãã¦ãã ããã ããã¯ãAPI ã使ç¨ãã¦ãªã¼ãã£ãªã¯ãªãããåé²ããæ¹æ³ã示ãã¾ãã 2 çªç®ã®è¨äºã®ã¡ãã£ã¢è¦ç´ ã®åé²ã§ã¯ã<audio> è¦ç´ ã¾ã㯠<video> è¦ç´ ããã¹ããªã¼ã ãåä¿¡ãã¦ãã£ããã£ããã¹ããªã¼ã ã使ç¨ããæ¹æ³ï¼ãã®å ´åã¯åé²ãã¦ãã¼ã«ã«ãã£ã¹ã¯ã«ä¿åããæ¹æ³ï¼ã«ã¤ãã¦èª¬æãã¾ãã
ãªãã¡ã¬ã³ã¹
BlobEvent-
ã¡ãã£ã¢ãã¼ã¿ã®ãã£ã³ã¯ï¼chunkã大ããªå¡ï¼ãåé²ããçµãããã³ã«ã
dataavailableåã®BlobEventã使ç¨ãã¦Blobå½¢å¼ã§æ¶è²»è ã«é ä¿¡ããã¾ãã MediaRecorder-
MediaStream åé² API ãå®è£ ãã主è¦ã¤ã³ã¿ã¼ãã§ã¤ã¹ã
MediaRecorderErrorEvent-
MediaStream åé² API ã«ãã£ã¦æããããã¨ã©ã¼ã表ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã ãã®
errorããããã£ã¯ãã¨ã©ã¼ãçºçãããã¨ã示ãDOMExceptionã§ãã
仿§æ¸
| 仿§æ¸ |
|---|
| MediaStream Recording > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- MediaStream åé² API ã®ä½¿ç¨
- ã¡ãã£ã¢è¦ç´ ã®åé²
- simpl.info ã® MediaStream Recording ã®ãã¢ãSam Dutton èï¼è±èªï¼
navigator.mediaDevices.getUserMedia()- Chrome ããã³ Firefox ã§åä½ä¸ã® HTML5 ã® Media Recorder APIï¼è±èªï¼
- Safari ããã³ Edge ç¨ã® MediaRecorder ããªãã£ã«ï¼è±èªï¼
- TutorRoom: getUserMedia ããã³ MediaRecorder API ã使ç¨ãã HTML åç»ã®ãã£ããã£/åç/ãã¦ã³ãã¼ãï¼GitHub ã®ã½ã¼ã¹ï¼ï¼è±èªï¼
- ç°¡åãªåç»é²ç»ãã¢
- é«åº¦ãªã¡ãã£ã¢ã¹ããªã¼ã ã¬ã³ã¼ãã¼ã®ãµã³ãã«ï¼è±èªï¼
- OpenLang: MediaDevices 㨠MediaStream åé² API ãåç»ã®é²ç»ã«ä½¿ç¨ãã HTML5 åç»è¨èªã©ãã¦ã§ãã¢ããªï¼GitHub ã®ã½ã¼ã¹ï¼ï¼è±èªï¼
- Safari æè¡ãã¬ãã¥ã¼ 73 ã§ MediaStream åé² API ãå©ç¨å¯è½ã«ï¼è±èªï¼