example camara and javascript html5 html5-canvas html5-video webcam

javascript - camara - No se puede tomar una foto desde la webcam usando HTML5 y getUserMedia() en Google Chrome en la carga de la primera página



webcam html5 (1)

DEMO EN VIVO

Funciona bien en Chrome y FF.

(function() { var streaming = false, video = document.querySelector(''#video''), canvas = document.querySelector(''#canvas''), photo = document.querySelector(''#photo''), startbutton = document.querySelector(''#startbutton''), width = 320, height = 0; navigator.getMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia); navigator.getMedia( { video: true, audio: false }, function(stream) { if (navigator.mozGetUserMedia) { video.mozSrcObject = stream; } else { var vendorURL = window.URL || window.webkitURL; video.src = vendorURL.createObjectURL(stream); } video.play(); }, function(err) { console.log("An error occured! " + err); } );

Este código encontré aquí: LINK DEVELOPER MOZILLA

ACTUALIZACIÓN: actualicé mi demostración en vivo a JSFiddle porque getUserMedia() ya no funciona en orígenes inseguros. Para utilizar esta función, debería considerar cambiar su aplicación a un origen seguro, como HTTPS. Ver The Chromium Projects para más detalles.

Tomando como referencia este artículo sobre HTML5Rocks , estoy tratando de construir una utilidad para tomar fotos desde la cámara web.

Debajo está mi fragmento de código HTML:

<button type="button" name="btnCapture" id="btnCapture">Start my camera</button><br /> <video autoplay="true" id="video" style="height:240px;width:320px"></video><canvas id="canvas" style="display: none; height:240px;width:320px"></canvas><br /> <img id="capturedImage" src="/blank.gif" style="height:240px;width:320px"><input type="hidden" id="hdnImageBase64" name="hdnImageBase64"><br />

Al hacer clic en el botón btnCapture , inicio mi cámara web y hago clic de nuevo. Captura la foto de la cámara web y la coloca en la imagen capturedImage .

A continuación está mi código JavaScript:

var video = document.getElementById("video"); var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var localMediaStream = null; var capturedImage = document.getElementById("capturedImage"); var buttonTextCapturePicture = "Say Cheese!"; function onFailSoHard(e) { if (e.code == 1) { alert("Something went wrong! Either your webcam is not connected or you denied access to it."); } else { alert("getUserMedia() not supported in your browser. Try using latest version of Google Chrome or Opera."); } } function snapshot() { if (localMediaStream) { try { ctx.drawImage(video, 0, 0); capturedImage.src = canvas.toDataURL("image/png"); document.getElementById("hdnImageBase64").value = canvas.toDataURL("image/png"); } catch (e) { alert("Something went wrong while capturing you. Try refreshing the page. " + e); } } } video.addEventListener("click", snapshot, false); function sizeCanvas() { setTimeout( function() { canvas.width = video.videoWidth; canvas.height = video.videoHeight; capturedImage.height = video.videoHeight; capturedImage.width = video.videoWidth; }, 50); } var button = document.getElementById("btnCapture"); button.addEventListener("click", function(e) { if (localMediaStream) { snapshot(); return; } if (navigator.getUserMedia) { navigator.getUserMedia("video", function(stream) { video.src = stream; localMediaStream = stream; sizeCanvas(); button.textContent = buttonTextCapturePicture; }, onFailSoHard); } else if (navigator.webkitGetUserMedia) { navigator.webkitGetUserMedia({"video" : true}, function(stream) { video.src = window.webkitURL.createObjectURL(stream); localMediaStream = stream; sizeCanvas(); button.textContent = buttonTextCapturePicture; }, onFailSoHard); } else { onFailSoHard({ target : video }); } }, false);

Cuando se hace clic en el botón btnCapture primera vez, llama a la función sizeCanvas() para configurar el lienzo y el ancho y alto de la imagen para el ancho y alto del video (es decir, 320 y 240). Cuando se hace clic en el botón por segunda vez, toma una instantánea codificada de Base64 de la cámara web utilizando canvas.toDataURL y la coloca en la imagen canvas.toDataURL .

Funciona en Opera. Pero en Google Chrome siempre falla la primera vez que se carga la página . Pero cuando la misma página se actualiza, funciona. Intentando depurar encontré que el código canvas.toDataURL devuelve la imagen Base64 como data:, por primera vez debido a que no puede dibujar la imagen, lo que da como resultado un error del Resource interpreted as Image but transferred with MIME type text/plain: "data:,". en la consola. Además, si no llamo a la función sizeCanvas entonces funciona por primera vez, pero luego la imagen no es de la dimensión que requiero y se recorta.

¿Alguna idea de cómo puedo hacer que funcione en Chrome la primera vez con sizeCanvas ?

Google Chrome: 24.0.1312.57 Opera: 12.11