Limited availability
HTMLMediaElement
æ¥å£ç srcObject
屿§è®¾å®æè¿åä¸ä¸ªå¯¹è±¡ï¼è¿ä¸ªå¯¹è±¡æä¾äºä¸ä¸ªä¸ HTMLMediaElement
å
³èçåªä½æºã
该对象å¯ä»¥æ¯ä¸ä¸ª MediaStream
ãä¸ä¸ª MediaSource
ãä¸ä¸ª Blob
æè
ä¸ä¸ª File
ç±»åï¼è¯¥ç±»åç»§æ¿èª Blob
ï¼ã
夿³¨ï¼ æªè³ 2020 å¹´ 3 æï¼ä»
æ Safari æµè§å¨å®å
¨æ¯æ srcObject
ï¼åªè½ä½¿ç¨ MediaSource
ãMediaStream
ãBlob
å File
对象ä½ä¸ºå
¶å¼ãå
¶ä»æµè§å¨ä»
æ¯æ MediaStream
对象ï¼å¨å®ä»¬è·è¿æ¯æä¹åï¼å¯ä»¥èèåéå°ä½¿ç¨ URL.createObjectURL()
æ¥å建 URLï¼å¹¶å°å
¶èµç» HTMLMediaElement.src
ï¼ä¸æä¼æç¤ºä¾ï¼ãå¦å¤ï¼èª 108 çæ¬èµ·ï¼Chromium æ¯æéè¿å°ä» worker ä¼ è¾è¿æ¥ç MediaSource
对象ç MediaSourceHandle
å®ä¾èµå¼ç» srcObject
ï¼æ¥è¿æ¥ä¸ä¸ªä¸ç¨ workerã
ä¸ä¸ª MediaStream
ãMediaSource
ãBlob
æ File
对象ï¼å
·ä½æ¯æè¯·åè§å
¼å®¹æ§è¡¨æ ¼ï¼ã
åªä½æºè§èçè¾æ©çæ¬è¦æ±ä½¿ç¨ URL.createObjectURL()
æ¥å建ä¸ä¸ªå¯¹è±¡ URLï¼ç¶åå° src
设置为该 URLãç°å¨ï¼ä½ å¯ä»¥ç´æ¥å° srcObject
设置为 MediaStream
ã
卿¤ç¤ºä¾ä¸ï¼æ¥èªæå头ç MediaStream
被èµå¼ç»äºæ°å建ç <video>
å
ç´ ã
const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
const video = document.createElement("video");
video.srcObject = mediaStream;
卿¤ç¤ºä¾ä¸ï¼æ°å建ç MediaSource
被èµå¼ç»äºæ°å建ç <video>
å
ç´ ã
const mediaSource = new MediaSource();
const video = document.createElement("video");
video.srcObject = mediaSource;
æ¯æåéå° src 屿§
以ä¸ç¤ºä¾æ¯æéå建对象 URL å¹¶å°å
¶èµå¼ç» src
çè¾æ§æµè§å¨çæ¬ï¼ä»¥é²æ¢ srcObject
ä¸åæ¯æã
é¦å
ï¼æ¥èªæå头ç MediaStream
被èµå¼ç»æ°å建ç <video>
å
ç´ ï¼å¹¶ä¸ºæ§çæµè§å¨æä¾äºå鿝æã
const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true });
const video = document.createElement("video");
if ("srcObject" in video) {
video.srcObject = mediaStream;
} else {
// é¿å
卿°çæµè§å¨ä¸ä½¿ç¨æ¤æ¹æ³ï¼å 为å®å³å°è¢«æ·æ±°ã
video.src = URL.createObjectURL(mediaStream);
}
å
¶æ¬¡ï¼å°æ°å建ç MediaSource
èµå¼ç»æ°å建ç <video>
å
ç´ ï¼å¹¶ä¸ºæ§çæµè§å¨ä»¥åå°ä¸ç´æ¥æ¯æ MediaSource
åé
çæµè§å¨æä¾äºåéæ¹æ¡ã
const mediaSource = new MediaSource();
const video = document.createElement("video");
// æ§çæµè§å¨å¯è½ä¸æ¯æ srcObject 屿§ã
if ("srcObject" in video) {
try {
video.srcObject = mediaSource;
} catch (err) {
if (err.name !== "TypeError") {
throw err;
}
// å³ä¾¿å®ä»¬æ¯æï¼ä¹å¯è½ä»
éäºæ¯æ MediaStream
video.src = URL.createObjectURL(mediaSource);
}
} else {
video.src = URL.createObjectURL(mediaSource);
}
å¨ worker ä¸æå»º MediaSource
å¹¶å°å
¶ä¼ éç»ä¸»çº¿ç¨ä»¥è¿è¡ææ¾
MediaSource.handle
屿§å¯ä»¥å¨ä¸ç¨ worker å
é¨è®¿é®ï¼ç¶åéè¿ postMessage()
è°ç¨ï¼å°å¾å°ç MediaSourceHandle
å¯¹è±¡ä¼ è¾å°å建该 worker ç线ç¨ï¼æ¬ç¤ºä¾ä¸ä¸ºä¸»çº¿ç¨ï¼ï¼
// å¨ä¸ç¨ worker å
é¨
let mediaSource = new MediaSource();
let handle = mediaSource.handle;
// å°å¥æè½¬ç§»ç»å建 worker çä¸ä¸æ
postMessage({ arg: handle }, [handle]);
mediaSource.addEventListener("sourceopen", () => {
// å¨å建 SourceBuffers å¹¶ç¨è·åçåªä½å
容填å
å®ä»¬ä¹åï¼è¯·çå¾
MediaSource ä¸ç sourceopen äºä»¶ââç´å° MediaSource éå å° HTMLMediaElementãå¹¶ä¸å
¶ readyState å为âopenâï¼MediaSource æä¼æ¥å SourceBuffer çå建ã
});
å¨ä¸»çº¿ç¨ä¸ï¼æä»¬éè¿ message
äºä»¶å¤ç卿¥æ¶å¥æï¼éè¿ <video>
ä¸ç HTMLMediaElement.srcObject
屿§å°å
¶éçå°è¯¥å
ç´ ä¸ï¼å¹¶è°ç¨ play
æ¹æ³ææ¾è§é¢ï¼
worker.addEventListener("message", (msg) => {
let mediaSourceHandle = msg.data.arg;
video.srcObject = mediaSourceHandle;
video.play();
});
夿³¨ï¼ MediaSourceHandle
æ æ³æåä¼ è¾å°å
±äº« worker æ service workerã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4