File size: 2,435 Bytes
ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e 3207814 ff9325e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import { writable, type Writable } from 'svelte/store';
export enum MediaStreamStatusEnum {
INIT = "init",
CONNECTED = "connected",
DISCONNECTED = "disconnected",
}
export const onFrameChangeStore: Writable<{ now: Number, metadata: VideoFrameCallbackMetadata, blob: Blob }> = writable();
export const mediaDevices = writable<MediaDeviceInfo[]>([]);
export const mediaStreamStatus = writable(MediaStreamStatusEnum.INIT);
export const mediaStream = writable<MediaStream | null>(null);
export const mediaStreamActions = {
async enumerateDevices() {
// console.log("Enumerating devices");
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 switchCamera(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}`);
});
},
async stop() {
navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => {
stream.getTracks().forEach((track) => track.stop());
});
mediaStreamStatus.set(MediaStreamStatusEnum.DISCONNECTED);
mediaStream.set(null);
},
}; |