in client/src/components/camera-preview/camera-preview.ts [77:126]
async start(): Promise<any> {
if (!cameraStreamIsAvailable()) {
throw new Error('User media not supported');
} else if (this.status !== CameraPreviewStatus.Stopped) {
throw new Error('Video stream already started');
} else if (!this.video) {
throw new Error('Component not ready');
}
logger.log('Starting video stream');
this._status = CameraPreviewStatus.Starting;
// assume full window size
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
let desiredWidth = windowWidth * window.devicePixelRatio;
let desiredHeight = windowHeight * window.devicePixelRatio;
if (desiredWidth < desiredHeight) {
// have to flip requested video dimensions when in portrait mode
const tmp = desiredWidth;
desiredWidth = desiredHeight;
desiredHeight = tmp;
}
const video = this.video;
logger.log(`Requesting video at ${desiredWidth}x${desiredHeight}`);
try {
const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video:
{ width: desiredWidth, height: desiredHeight, facingMode: 'environment' } });
this.videoStream = stream;
video.srcObject = stream;
} catch (err) {
if (err instanceof DOMException) {
logger.warn('Unable to get video stream with ideal dimensions, trying default dimensions.', err);
const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { facingMode: 'environment' } });
this.videoStream = stream;
video.srcObject = stream;
} else {
logger.warn('Unable to start video stream.', err);
throw err;
}
}
await video.play();
logger.log(`Video stream started at ${video.videoWidth}x${video.videoHeight}`);
this._status = CameraPreviewStatus.Started;
for (const track of this.videoStream.getTracks()) {
track.addEventListener('ended', this.onVideoStreamEnded);
}
if (windowWidth !== window.innerWidth || windowHeight !== window.innerHeight) {
logger.log('Window size has changed - restarting video');
await this.restart();
}
}