diff --git a/src/camera.js b/src/camera.js index 8041a9e..cf20f73 100644 --- a/src/camera.js +++ b/src/camera.js @@ -15,7 +15,14 @@ export async function startCamera(videoElement) { videoElement.srcObject = stream; videoElement.setAttribute('playsinline', ''); - await videoElement.play(); + + try { + await videoElement.play(); + } catch (error) { + for (const track of stream.getTracks()) track.stop(); + videoElement.srcObject = null; + throw error; + } return { stop() { @@ -38,8 +45,17 @@ function drawScaled(source, sourceWidth, sourceHeight, maxEdge) { return context.getImageData(0, 0, width, height); } +function assertHasSize(width, height) { + if (!(width > 0) || !(height > 0)) { + throw new Error( + 'Das Kamerabild ist noch nicht bereit. Bitte gleich noch einmal versuchen.', + ); + } +} + /** Einzelbild aus dem laufenden Kamerastrom. */ export function grabFrame(videoElement, maxEdge = 1280) { + assertHasSize(videoElement.videoWidth, videoElement.videoHeight); return drawScaled( videoElement, videoElement.videoWidth, @@ -51,6 +67,7 @@ export function grabFrame(videoElement, maxEdge = 1280) { /** Ersatzweg ohne Kamera: Bilddatei auswaehlen (z. B. am Rechner). */ export async function imageDataFromFile(file, maxEdge = 1280) { const bitmap = await createImageBitmap(file); + assertHasSize(bitmap.width, bitmap.height); const data = drawScaled(bitmap, bitmap.width, bitmap.height, maxEdge); bitmap.close(); return data;