Limited availability
HTMLMediaElement
ì¸í°íì´ì¤ì srcObject
ìì±ì HTMLMediaElement
ì ê´ë ¨ë 미ëì´ ìì¤ ìí ì íë ê°ì²´ë¥¼ ì¤ì íê±°ë ë°íí©ëë¤.
srcObject ê°ì²´ë MediaStream
, a MediaSource
, a Blob
ëë File
(Blob
ì ìì)ì¼ ì ììµëë¤.
ì°¸ê³ : 2020ë
3ì íì¬ Safarië§ì´ srcObject
를 ìë²½íê² ì§ìí©ëë¤. ì¦, MediaSource
, MediaStream
, Blob
, ê·¸ë¦¬ê³ File
ê°ì²´ë¥¼ ê°ì¼ë¡ ì¬ì©í©ëë¤. ë¤ë¥¸ ë¸ë¼ì°ì ë MediaStream
ê°ì²´ë¥¼ ì§ìí©ëë¤. ë¤ë¥¸ ë¸ë¼ì°ì ë¤ì´ ì§ìí ëê¹ì§ URL.createObjectURL()
ì ì¬ì©íì¬ URLì ìì±íê³ ì´ë¥¼ HTMLMediaElement.src
ì í ë¹íë ê²ì ê³ ë ¤íì¸ì(ìì ë ìëì ììµëë¤). ëí ë²ì 108ë¶í° Chromiumì í´ë¹ ê°ì²´ì MediaSourceHandle
ì¸ì¤í´ì¤(ì커ìì ì ì¡ë¨)를 srcObject
ì í ë¹íì¬ ì ì© ì커 MediaSource
ê°ì²´ ì°ê²°ì ì§ìí©ëë¤.
MediaStream
, MediaSource
, Blob
ëë File
ê°ì²´(ì¤ì ë¡ ì§ìëë ë´ì©ì í¸íì± í를 ì°¸ê³ íì¸ì).
ì´ì ë²ì ì 미ëì´ ìì¤ ëª
ì¸ë 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 ìì±ì ëí í´ë°± ì§ì
ìë ìì ë srcObject
ê° ì§ìëì§ ìë ê²½ì° ê°ì²´ URLì ë§ë¤ê³ ì´ë¥¼ src
ì í ë¹í´ì¼ íë ì´ì ë¸ë¼ì°ì ë²ì ì ì§ìí©ëë¤.
먼ì ì¹´ë©ë¼ì 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;
}
// ë§ì½ srcObjectê° ìëë¼ë MediaStreamë§ ì§ìíë ê²½ì°ê° ìì ì ììµëë¤.
video.src = URL.createObjectURL(mediaSource);
}
} else {
video.src = URL.createObjectURL(mediaSource);
}
ì커ìì MediaSource
를 구ì±íê³ ì¬ìì ìí´ ë©ì¸ ì¤ë ë(main thread)ì ì ë¬í기
MediaSource.handle
ìì±ì ì ì© ì커 ë´ìì ì¡ì¸ì¤ í ì ìì¼ë©° ê²°ê³¼ ê° MediaSourceHandle
ê°ì²´ë postMessage()
í¸ì¶ì íµí´ ì커를 ìì±í ì¤ë ë(ì´ ê²½ì° ë©ì¸ ì¤ë ë)ë¡ ì ì¡ë©ëë¤.
// ë´ë¶ ì ì© ì커
let mediaSource = new MediaSource();
let handle = mediaSource.handle;
// ì커를 ë§ë 컨í
ì¤í¸ë¡ í¸ë¤ì ì ì¡í©ëë¤
postMessage({ arg: handle }, [handle]);
mediaSource.addEventListener("sourceopen", () => {
// SourceBuffers를 ìì±íê³ ê°ì ¸ì¨(fetched) 미ëì´ë¡ ì±ì°ê¸° ì ì
// MediaSourceìì sourceopenì 기ë¤ë¦¬ì¸ì(await). MediaSourceë
// HTMLMediaElementì ì°ê²°ëê³ readyStateê° "open"ì´ ë ëê¹ì§
// SourceBuffers ìì±ì ìë½íì§ ììµëë¤.
});
ë©ì¸ ì¤ë ëìì message
ì´ë²¤í¸ í¸ë¤ë¬ë¥¼ íµí´ í¸ë¤ì ìì íê³ HTMLMediaElement.srcObject
ìì±ì íµí´ <video>
ì 첨ë¶íê³ ë¹ëì¤ë¥¼ play
í©ëë¤.
worker.addEventListener("message", (msg) => {
let mediaSourceHandle = msg.data.arg;
video.srcObject = mediaSourceHandle;
video.play();
});
ëª ì¸ ë¸ë¼ì°ì í¸íì±ì°¸ê³ :
MediaSourceHandle
ë ê³µì ì커 ëë ìë¹ì¤ ì커를 íµí´ ì±ê³µì ì¼ë¡ ì ì¡í ì ììµëë¤.
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