getUserMedia API及HTML5 调用手机摄像头拍照

getUserMedia API简介

HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头、视频、音频、地理位置等)的接口,基于该接口,开发者能够在不依赖任何浏览器插件的条件下访问硬件媒体设备。
getUserMedia API最初是navigator.getUserMedia,目前已被最新Web标准废除,变动为navigator.mediaDevices.getUserMedia(),但浏览器支持状况不如旧版API普及。
MediaDevices.getUserMedia()方法提示用户容许使用一个视频和/或一个音频输入设备,例如相机或屏幕共享和/或麦克风。若是用户给予许可,就返回一个Promise对象,MediaStream对象做为此Promise对象的Resolved[成功]状态的回调函数参数,相应的,若是用户拒绝了许可,或者没有媒体可用的状况下PermissionDeniedError或者NotFoundError做为此PromiseRejected[失败]状态的回调函数参数。注意,因为用户不会被要求必须做出容许或者拒绝的选择,因此返回的Promise对象可能既不会触发resolve也不会触发 rejectweb

浏览器兼容性

clipboard.png

语法

navigator.mediaDevices.getUserMedia(constraints)
.then(function(mediaStream) { ... })
.catch(function(error) { ... })

参数

containers:指定请求的媒体类型,主要包含videoaudio,必须至少一个类型或者两个同时能够被指定。若是浏览器没法找到指定的媒体类型或者没法知足相对应的参数要求,那么返回的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的参数streamstreamMediaStream的对象,表示媒体内容的数据流,能够经过URL.createObjectURL转换后设置为VideoAudio元素的src属性来使用,部分较新的浏览器也能够直接设置为srcObject属性来使用。操作系统


失败回调函数errorCallback的参数error,可能的异常有:插件

  • AbortError:硬件问题
  • NotAllowedError:用户拒绝了当前的浏览器实例的访问请求;或者用户拒绝了当前会话的访问;或者用户在全局范围内拒绝了全部媒体访问请求。
  • NotFoundError:找不到知足请求参数的媒体类型。
  • NotReadableError:操做系统上某个硬件、浏览器或者网页层面发生的错误致使设备没法被访问。
  • OverConstrainedError:指定的要求没法被设备知足。
  • SecurityError:安全错误,在getUserMedia() 被调用的 Document
    上面,使用设备媒体被禁止。这个机制是否开启或者关闭取决于单个用户的偏好设置。
  • TypeError:类型错误,constraints对象未设置[空],或者都被设置为false

示例:HTML 5调用媒体设备摄像头

这个例子中,请求访问用户硬件设备的摄像头,并把视频流经过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 的滤镜实现模糊、黑白等效果。

相关文章
相关标签/搜索