Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Take a picture with getUserMedia
<html>
<body>
<video id="v" width="300" height="300"></video>
<input id="b" type="button" disabled="true" value="Take Picture"></input>
<canvas id="c" style="display:none;" width="300" height="300"></canvas>
</body>
<script>
navigator.getUserMedia({video: true}, function(stream) {
var video = document.getElementById("v");
var canvas = document.getElementById("c");
var button = document.getElementById("b");
video.src = stream;
button.disabled = false;
button.onclick = function() {
canvas.getContext("2d").drawImage(video, 0, 0, 300, 300, 0, 0, 300, 300);
var img = canvas.toDataURL("image/png");
alert("done");
};
}, function(err) { alert("there was an error " + err)});
</script>
</html>

Commenting this old gist as it's a good google rank. Line 13 needs to be the following in order the stream the video preview.

      video.srcObject = stream;
      video.play();

I ran into some problems when I tried this gist on Chrome > v55:

  1. The navigator.getUserMedia() method is deprecated in favor of navigator.mediaDevices.getUserMedia() (https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia, no more prefixes!).
  2. As noted by @Jackbennett, video.src = stream fails and should be replaced with a valid URL, that we can generate like this:
video.src = window.URL.createObjectURL(stream);
  1. I needed to dynamically create and resize the canvas to take the full picture of the webcam.

Here's a working example (tested on Chrome 55, Firefox 51):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>HTML5 Media Device Access</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    video, img {
      max-width:100%;
    }
  </style>
</head>
<body>

<video autoplay></video>

<script>
  (function() {
    'use strict';
    var video = document.querySelector('video')
      , canvas;

    /**
     *  generates a still frame image from the stream in the <video>
     *  appends the image to the <body>
     */
    function takeSnapshot() {
      var img = document.querySelector('img') || document.createElement('img');
      var context;
      var width = video.offsetWidth
        , height = video.offsetHeight;

      canvas = canvas || document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;

      context = canvas.getContext('2d');
      context.drawImage(video, 0, 0, width, height);

      img.src = canvas.toDataURL('image/png');
      document.body.appendChild(img);
    }

    // use MediaDevices API
    // docs: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
    if (navigator.mediaDevices) {
      // access the web cam
      navigator.mediaDevices.getUserMedia({video: true})
      // permission granted:
        .then(function(stream) {
          video.src = window.URL.createObjectURL(stream);
          video.addEventListener('click', takeSnapshot);
        })
        // permission denied:
        .catch(function(error) {
          document.body.textContent = 'Could not access the camera. Error: ' + error.name;
        });
    }
  })();

</script>
</body>
</html>

jan-ivar commented Feb 19, 2017

@TobiasSeitz Please replace video.src = window.URL.createObjectURL(stream) with video.srcObject = stream, as createObjectURL with a stream as argument is being deprecated.

thank you so much help me a lot

@TobiasSeitz @jan-ivar Thank you so much, this will help me a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment