首先嘗試獲取 local 端的 media stream 並將 stream 加入到 video 元素中
useRef
更新獲取的 streamOpen Media
的 button//使用 stream 更新 ref
export default function App() {
const localVideoRef = useRef(null);
const remoteVideoRef = useRef(null);
return (
<div>
<button onClick={openMedia}>Open Media</button>
<br />
{/* local 需要 muted */}
<video ref={localVideoRef} autoPlay muted playsInline />
<br />
<video ref={remoteVideoRef} autoPlay playsInline />
</div>
);
}
openMedia constraints
中 選擇需要獲取video
&audio
try catch
避免沒有獲取 stream 而錯誤remoteStream
創建 new MediaStream()
const localStream = useRef(null);
const remoteStream = useRef(null);
async function openMedia() {
try {
// 獲取 local 的 video&audio
const constraints = { video: true, audio: true };
const stream = await navigator.mediaDevices.getUserMedia(constraints);
// 若有 localVideoRef 則更新至 video srcObject
if (localVideoRef.current) {
localVideoRef.current.srcObject = stream;
}
// 更新 localStream 和 remoteStream
localStream.current = stream;
remoteStream.current = new MediaStream();
console.log(localStream.current, remoteStream.current);
} catch (error) {
console.log(error);
window.alert("請確認已開啟視訊及麥克風");
}
}
把 MediaStream console 可以看到 localStream.current
active:true
表示這個媒體流目正在捕獲視訊和音訊數據,且包含很多 method 可以使用,在前面的文章有介紹過 [Day8] MediaStreams - getUserMedia [Day9] MediaStreams - getTracks、addTrack ~
今天使用 openMedia
獲取了使用者的媒體並渲染在畫面上,下一篇會使用 Firebase Cloud Firestore 創建視訊間