| | import { writable, type Writable, get } from 'svelte/store'; |
| |
|
| | export enum MediaStreamStatusEnum { |
| | INIT = "init", |
| | CONNECTED = "connected", |
| | DISCONNECTED = "disconnected", |
| | } |
| | export const onFrameChangeStore: Writable<{ blob: Blob }> = writable({ blob: new Blob() }); |
| |
|
| | export const mediaDevices = writable<MediaDeviceInfo[]>([]); |
| | export const mediaStreamStatus = writable(MediaStreamStatusEnum.INIT); |
| | export const mediaStream = writable<MediaStream | null>(null); |
| |
|
| | export const mediaStreamActions = { |
| | async enumerateDevices() { |
| | |
| | await navigator.mediaDevices.enumerateDevices() |
| | .then(devices => { |
| | const cameras = devices.filter(device => device.kind === 'videoinput'); |
| | mediaDevices.set(cameras); |
| | }) |
| | .catch(err => { |
| | console.error(err); |
| | }); |
| | }, |
| | async start(mediaDevicedID?: string) { |
| | const constraints = { |
| | audio: false, |
| | video: { |
| | width: 1024, height: 1024, deviceId: mediaDevicedID |
| | } |
| | }; |
| |
|
| | await navigator.mediaDevices |
| | .getUserMedia(constraints) |
| | .then((stream) => { |
| | mediaStreamStatus.set(MediaStreamStatusEnum.CONNECTED); |
| | mediaStream.set(stream); |
| | }) |
| | .catch((err) => { |
| | console.error(`${err.name}: ${err.message}`); |
| | mediaStreamStatus.set(MediaStreamStatusEnum.DISCONNECTED); |
| | mediaStream.set(null); |
| | }); |
| | }, |
| | async startScreenCapture() { |
| | const displayMediaOptions = { |
| | video: { |
| | displaySurface: "window", |
| | }, |
| | audio: false, |
| | surfaceSwitching: "include" |
| | }; |
| |
|
| |
|
| | let captureStream = null; |
| |
|
| | try { |
| | captureStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); |
| | const videoTrack = captureStream.getVideoTracks()[0]; |
| |
|
| | console.log("Track settings:"); |
| | console.log(JSON.stringify(videoTrack.getSettings(), null, 2)); |
| | console.log("Track constraints:"); |
| | console.log(JSON.stringify(videoTrack.getConstraints(), null, 2)); |
| | mediaStreamStatus.set(MediaStreamStatusEnum.CONNECTED); |
| | mediaStream.set(captureStream) |
| | } catch (err) { |
| | console.error(err); |
| | } |
| |
|
| | }, |
| | async switchCamera(mediaDevicedID: string) { |
| | if (get(mediaStreamStatus) !== MediaStreamStatusEnum.CONNECTED) { |
| | return; |
| | } |
| | const constraints = { |
| | audio: false, |
| | video: { width: 1024, height: 1024, deviceId: mediaDevicedID } |
| | }; |
| | await navigator.mediaDevices |
| | .getUserMedia(constraints) |
| | .then((stream) => { |
| | mediaStreamStatus.set(MediaStreamStatusEnum.CONNECTED); |
| | mediaStream.set(stream) |
| | }) |
| | .catch((err) => { |
| | console.error(`${err.name}: ${err.message}`); |
| | }); |
| | }, |
| | async stop() { |
| | navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { |
| | stream.getTracks().forEach((track) => track.stop()); |
| | }); |
| | mediaStreamStatus.set(MediaStreamStatusEnum.DISCONNECTED); |
| | mediaStream.set(null); |
| | }, |
| | }; |