HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头、视频、音频、地理位置等)的接口,基于该接口,开发者能够在不依赖任何浏览器插件的条件下访问硬件媒体设备。
getUserMedia API最初是navigator.getUserMedia
,目前已被最新Web标准废除,变动为navigator.mediaDevices.getUserMedia()
,但浏览器支持状况不如旧版API普及。 MediaDevices.getUserMedia()
方法提示用户容许使用一个视频和/或一个音频输入设备,例如相机或屏幕共享和/或麦克风。若是用户给予许可,就返回一个Promise
对象,MediaStream
对象做为此Promise
对象的Resolved
[成功]状态的回调函数参数,相应的,若是用户拒绝了许可,或者没有媒体可用的状况下PermissionDeniedError
或者NotFoundError
做为此Promise
的Rejected
[失败]状态的回调函数参数。注意,因为用户不会被要求必须做出容许或者拒绝的选择,因此返回的Promise
对象可能既不会触发resolve
也不会触发 reject
。web
navigator.mediaDevices.getUserMedia(constraints) .then(function(mediaStream) { ... }) .catch(function(error) { ... })
containers:
指定请求的媒体类型,主要包含video
和audio
,必须至少一个类型或者两个同时能够被指定。若是浏览器没法找到指定的媒体类型或者没法知足相对应的参数要求,那么返回的Promise
对象就会处于rejected
[失败]状态,NotFoundError
做为rejected
[失败]回调的参数。canvas
【例】同时请求不带任何参数的音频和视频:浏览器
{ audio: true, video: true }
【例】使用1280x720的摄像头分辨率:安全
{ audio: true, video: { width: 1280, height: 720 } }
【例】要求获取最低为1280x720的分辨率:ide
{ audio: true, video: { width: { min: 1024, ideal: 1280, max: 1920 }, height: { min: 776, ideal: 720, max: 1080 } } }
当请求包含一个ideal
(应用最理想的)值时,这个值有着更高的权重,意味着浏览器会先尝试找到最接近指定的理想值的设定或者摄像头(若是设备拥有不止一个摄像头)。函数
【例】优先使用前置摄像头(若是有的话):idea
{ audio: true, video: { facingMode: "user" } }
【例】强制使用后置摄像头:spa
{ audio: true, video: { facingMode: { exact: "environment" } } }
成功回调函数seccessCallback
的参数stream
:stream
是MediaStream
的对象,表示媒体内容的数据流,能够经过URL.createObjectURL
转换后设置为Video
或Audio
元素的src
属性来使用,部分较新的浏览器也能够直接设置为srcObject
属性来使用。操作系统
失败回调函数errorCallback
的参数error
,可能的异常有:插件
AbortError
:硬件问题NotAllowedError
:用户拒绝了当前的浏览器实例的访问请求;或者用户拒绝了当前会话的访问;或者用户在全局范围内拒绝了全部媒体访问请求。NotFoundError
:找不到知足请求参数的媒体类型。NotReadableError
:操做系统上某个硬件、浏览器或者网页层面发生的错误致使设备没法被访问。OverConstrainedError
:指定的要求没法被设备知足。SecurityError
:安全错误,在getUserMedia()
被调用的 Document
TypeError
:类型错误,constraints
对象未设置[空],或者都被设置为false
。这个例子中,请求访问用户硬件设备的摄像头,并把视频流经过Video元素显示出来。网页中提供一个"拍照"的按钮,经过Canvas将Video的画面截取并绘制,核心代码以下:
HTML
<!--video用于显示媒体设备的视频流,自动播放--> <video id="video" autoplay style="width: 480px;height: 320px"></video> <!--拍照按钮--> <div> <button id="capture">拍照</button> </div> <!--描绘video截图--> <canvas id="canvas" width="480" height="320"></canvas>
JavaScript
//访问用户媒体设备的兼容方法 function getUserMedia(constrains,success,error){ if(navigator.mediaDevices.getUserMedia){ //最新标准API navigator.mediaDevices.getUserMedia(constrains).then(success).catch(error); } else if (navigator.webkitGetUserMedia){ //webkit内核浏览器 navigator.webkitGetUserMedia(constrains).then(success).catch(error); } else if (navigator.mozGetUserMedia){ //Firefox浏览器 navagator.mozGetUserMedia(constrains).then(success).catch(error); } else if (navigator.getUserMedia){ //旧版API navigator.getUserMedia(constrains).then(success).catch(error); } } var video = document.getElementById("video"); var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); //成功的回调函数 function success(stream){ //兼容webkit内核浏览器 var CompatibleURL = window.URL || window.webkitURL; //将视频流设置为video元素的源 video.src = CompatibleURL.createObjectURL(stream); //播放视频 video.play(); } //异常的回调函数 function error(error){ console.log("访问用户媒体设备失败:",error.name,error.message); } if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia){ //调用用户媒体设备,访问摄像头 getUserMedia({ video:{width:480,height:320} },success,error); } else { alert("你的浏览器不支持访问用户媒体设备"); } //注册拍照按钮的单击事件 document.getElementById("capture").addEventListener("click",function(){ //绘制画面 context.drawImage(video,0,0,480,320); });
对本示例进行功能增强,好比使用CSS 3 的滤镜实现模糊、黑白等效果。