MediaStream
from user media devices// for camera, microphone
await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
// for screen sharing
await navigator.mediaDevices.getDisplayMedia({ video: true });
getDisplayMedia()
getDisplayMedia()
MediaStream
// from MediaStream
videoElement.srcObject = stream;
// deprecated
// videoElement.src = URL.createObjectURL(stream);
// from MediaStreamTrack
audioElement.srcObject = new MediaStream([audioTrack]);
autoplay
restrictionplaysinline
for mobile browsers MediaStream
from other sources// from canvas or other HTMLMediaElement
canvasElement.captureStream(fps);
// from WebAudio
audioContext.createMediaStreamDestination();
captureStream()
is still experimental MediaStream
const devices = await navigator.mediaDevices.enumerateDevices();
const [audioIn] = devices.filter(d => d.kind === "audioinput");
const [videoIn] = devices.filter(d => d.kind === "videoinput");
// Chrome, ChromiumEdge only
const [audioOut] = devices.filter(d => d.kind === "audiooutput");
default
deviceslabel
property until calling getUserMedia()
getUserMedia()
const [videoIn] = devices.filter(d => d.kind === "videoinput");
await navigator.mediaDevices.getUserMedia({
video: { deviceId: { exact: videoIn.deviceId } }
});
exact
keywordconst [audioOut] = devices.filter(d => d.kind === "audiooutput");
await audioElement.setSinkId(audioOut.deviceId);
MediaStream
const mediaRecorder = new MediaRecorder(stream);
const chunks = [];
mediaRecorder.ondataavailable = ev => chunks.push(ev.data);
mediaRecorder.onstop = () =>
finalize(new Blob(chunks, { type: "audio/ogg; codecs=opus" }));
mediaRecorder.start();
// mediaRecorder.stop();
const pc = new RTCPeerConnection({ forceEncodedVideoInsertableStreams: true });
const senderStreams = videoSender.getEncodedVideoStreams();
senderStreams.readable
.pipeThrough(senderTransform) // your pipeline here
.pipeTo(senderStreams.writable);
const wss = new WebSocketStream(url);
const { readable } = await wss.connection;
const reader = readable.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) break;
await process(value);
}
WebSocket
meets whatwg/streams
const transport = new QuicTransport("example.com", 10001);
setInterval(async () => {
const stream = await transport.createSendStream();
const writer = stream.writable.getWriter();
writer.write(getSerializedGameState());
writer.close();
}, 100);
RTCQuicTransport
: Chrome(Canary) only๏ผ
const videoDecoder = new VideoDecoder({
output(videoFrame) {
const bitmap = videoFrame.transferToImageBitmap();
canvasContext.transferFromImageBitmap(bitmap);
}
});
await videoDecoder.configure({ codec: "vp8" });
// provides stream of encoded chunks to decoder
streamEncodedChunks(chunk => videoDecoder.decode(chunk));