MediaDevices.getUserMedia()
This is an experimental technology
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future versions of browsers as the specification changes.
The MediaDevices.getUserMedia()
method prompts the user for permission to use one video and/or one audio input device such as a camera or screensharing and/or a microphone. If the user provides permission, then the returned Promise
is resolved with the resulting MediaStream
object. If the user denies permission, or media is not available, then the promise is rejected with PermissionDeniedError
or NotFoundError
respectively. Note that it is possible for the returned promise to neither resolve nor reject, as the user is not required to make a choice.
Syntax
navigator.mediaDevices.getUserMedia(constraints) .then(function(mediaStream) { ... }) .catch(function(error) { ... })
Parameters
constraints
-
Is a
MediaStreamConstraints
object specifying the types of media to request, along with any requirements for each type.The constraints parameter is a
MediaStreamConstraints
object with two members:video
andaudio
, describing the media types requested. Either or both must be specified. If the browser cannot find all media tracks with the specified types that meet the constraints given, then the returned promise is rejected withNotFoundError
.The following requests both audio and video without any specific requirements:
JavaScriptCopy Code{ audio: true, video: true }
While information about a user's cameras and microphones are inaccessible for privacy reasons, an application can request the camera and microphone capabilities it needs and wants, using additional constraints. The following expresses a preference for 1280x720 camera resolution:
JavaScriptCopy Code{ audio: true, video: { width: 1280, height: 720 } }
The browser will try to honor this, but may return other resolutions if an exact match is not available, or the user overrides it.
To require a capability, use the keywords
min
,max
, orexact
(a.k.a. min == max). The following demands a minimum resolution of 1280x720:JavaScriptCopy Code{ audio: true, video: { width: { min: 1280 }, height: { min: 720 } } }
If no camera exists with this resolution or higher, then the returned promise will be rejected with
NotFoundError
, and the user will not be prompted.The reason for the difference in behavior is that the keywords
min
,max
, andexact
are inherently mandatory, whereas plain values and a keyword calledideal
are not. Here's a fuller example:JavaScriptCopy Code{ audio: true, video: { width: { min: 1024, ideal: 1280, max: 1920 }, height: { min: 776, ideal: 720, max: 1080 } } }
An
ideal
value, when used, has gravity, which means that the browser will try to find the setting (and camera, if you have more than one), with the smallest fitness distance from the ideal values given.Plain values are inherently ideal, which means that the first of our resolution examples above could have been written like this:
JavaScriptCopy Code{ audio: true, video: { width: { ideal: 1280 }, height: { ideal: 720 } } }
Not all constraints are numbers. For example, on mobile devices, the following will prefer the front camera (if one is available) over the rear one:
JavaScriptCopy Code{ audio: true, video: { facingMode: "user" } }
To require the rear camera, use:
JavaScriptCopy Code{ audio: true, video: { facingMode: { exact: "environment" } } }
Return value
A Promise
that resolves to a MediaStream
object.
Exceptions
Rejections of the returned promise are made with a DOMException
object. Possible exceptions are:
- AbortError
- Although the user and operating system both granted access to the hardware device, and no hardware issues occurred that would throw the
NotReadableError
exception, some problem occurred which prevented the device from being used. NotAllowedError
- The user has specified that the current browsing instance is not permitted access to the device; or the user has denied access for the current session; or the user has denied all access to user media devices globally.
Older versions of the specification used
SecurityError
for this instead;SecurityError
has taken on a new meaning. NotFoundError
- No media tracks of the type specified were found that satisfy the given constraints.
NotReadableError
- Although the user granted permission to use the matching devices, a hardware error occurred at the operating system, browser, or Web page level which prevented access to the device.
OverConstrainedError
- The specified constraints resulted in no candidate devices which met the criteria requested. The exception is an object of type
OverconstrainedError
, and has aconstraint
property whose value is a constraint which was impossible to meet, and amessage
property containing a human-readable string explaining the problem.Because this exception can be thrown even when the user has not yet granted permission to use the underlying device, it can potentially be used as a fingerprinting surface. SecurityError
- User media support is disabled on the
Document
on whichgetUserMedia()
was called. The mechanism by which user media support is enabled and disabled is left up to the individual user agent. TypeError
- The list of constraints specified is empty, or has all constraints set to
false
.
Examples
Using the Promise
This example assigns the returned MediaStream
object to the appropriate element.
var p = navigator.mediaDevices.getUserMedia({ audio: true, video: true }); p.then(function(mediaStream) { var video = document.querySelector('video'); video.src = window.URL.createObjectURL(mediaStream); video.onloadedmetadata = function(e) { // Do something with the video here. }; }); p.catch(function(err) { console.log(err.name); }); // always check for errors at the end.
Width and height
Here's an example of using mediaDevices.getUserMedia()
, including a polyfill to cope with older browsers.
var promisifiedOldGUM = function(constraints) { // First get ahold of getUserMedia, if present var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia); // Some browsers just don't implement it - return a rejected promise with an error // to keep a consistent interface if(!getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser')); } // Otherwise, wrap the call to the old navigator.getUserMedia with a Promise return new Promise(function(resolve, reject) { getUserMedia.call(navigator, constraints, resolve, reject); }); } // Older browsers might not implement mediaDevices at all, so we set an empty object first if(navigator.mediaDevices === undefined) { navigator.mediaDevices = {}; } // Some browsers partially implement mediaDevices. We can't just assign an object // with getUserMedia as it would overwrite existing properties. // Here, we will just add the getUserMedia property if it's missing. if(navigator.mediaDevices.getUserMedia === undefined) { navigator.mediaDevices.getUserMedia = promisifiedOldGUM; } // Prefer camera resolution nearest to 1280x720. var constraints = { audio: true, video: { width: 1280, height: 720 } }; navigator.mediaDevices.getUserMedia(constraints) .then(function(stream) { var video = document.querySelector('video'); video.src = window.URL.createObjectURL(stream); video.onloadedmetadata = function(e) { video.play(); }; }) .catch(function(err) { console.log(err.name + ": " + err.message); });
Frame rate
Lower frame-rates may be desirable in some cases, like WebRTC transmissions with bandwidth restrictions.
var constraints = { video: { frameRate: { ideal: 10, max: 15 } } };
Front and back camera
On mobile phones.
var front = false; document.getElementById('flip-button').onclick = function() { front = !front; }; var constraints = { video: { facingMode: (front? "user" : "environment") } };
Permissions
To use getUserMedia()
in an installable app (for example, a Firefox OS app), you need to specify one or both of the following fields inside your manifest file:
"permissions": { "audio-capture": { "description": "Required to capture audio using getUserMedia()" }, "video-capture": { "description": "Required to capture video using getUserMedia()" } }
See permission: audio-capture and permission: video-capture for more information.
Specifications
Specification | Status | Comment |
---|---|---|
Media Capture and Streams The definition of 'MediaDevices.getUserMedia()' in that specification. |
Editor's Draft | Initial definition |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Stream API | 53.0[1][3] | 36 (36) [2] | No support | 40[1] | No support |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Stream API | No support | 53.0[1][3] | 36.0 (36) [2] | No support | 40[1] | No support | 53.0[1][3] |
[1] Older versions of Chrome and Opera implement navigator.webkitGetUserMedia
, the prefixed version of the legacy navigator.getUserMedia
method.
From version 47 to 52, the promise-based interface was only available through the adapter.js polyfill, or using the flag chrome://flags/#enable-experimental-web-platform-features. Starting with version 53, the promise-based interface is on by default, though that interface is still not available through navigator
.
[2] Older versions of Firefox implement navigator.mozGetUserMedia
, the prefixed version of the legacy navigator.getUserMedia
method.
This promise-based interface and the constraint syntax described here is available as of Firefox 38. Earlier versions (32-37) used an outdated constraint syntax, but the syntax described here, as well as the promise-based interface, is available there through the adapter.js polyfill.
Firefox 49 includes changes to bring the thrown exceptions up to date with the specification, including the change to the meaning of the SecurityError
exception.
Opera uses an outdated constraint syntax, but the syntax described here is available through the adapter.js polyfill.
[3] Chrome throws error if the page serving the script is loaded from insecure origin (i.e. HTTP).
See also
- The older navigator.getUserMedia legacy API.
- navigator.enumerateDevices - learn the types and number of devices the user has available.
- WebRTC - the introductory page to the API
- MediaStream API - the API for the media stream objects
- Taking webcam photos - a tutorial on using
getUserMedia() for taking photos rather than video.
License
© 2016 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-us/docs/web/api/mediadevices/getusermedia