JS调用本地设备

Posted on 2019-03-16 17:32  lc_博客  阅读(649)  评论(0)    收藏  举报

JS 允许通过 navigator.mediaDevices.getUserMedia(options) 直接调用本地的设备,比如麦克风,摄像头等。因为该操作涉及到用户隐私,所以调用的时候会弹框请求权限。

该操作返回一个 Promise 对象,如果调用成功,会resolve 并返回一个 MediaStream 对象给回调函数:

 1 const options = {
 2     audio: true //调用本地麦克风
 3     video: true //调用本地摄像头
 4 }
 5 navigator.mediaDevices.getUserDevice(options).then(stream => {
 6    audio.srcObject = stream;
 7    audio.onloadedmetadata = () => {
 8        audio.play(); 
 9    }  
10 })

如果用户拒绝使用麦克风或者摄像头权限,则会reject该请求:

1 navigator.mediaDevices.getUserDevice(options).then(stream => {
2     ...
3 }).catch(error => {
4    // 如果用户拒绝权限请求,或者找不到对应的设备,会被catch到 
5 })

当使用摄像头的时候,还可以自定义相机的分辨率:

1 const options = {
2     video: {
3         width: 1280,
4         height: 720  
5     }    
6 }

也可以通过指定min、max、ideal 来设置最小、最大以及理想的分辨率,但是需要注意的是如果满足该参数,比如摄像头的最大分辨率是1280*760,但此时设置的height 属性最小分辨率为730,就会抛出 OverconstrainedError ,所以设置自定义参数的时候需要考虑设备是否能满足。

此时有人可能会问,如果我有多个摄像头,对,就是说手机,那调用的是哪一个呢?

当我们指定video的ideal属性的时候,这个优先级最高,系统会默认寻找最接近该值的摄像头。但是我们也可以自己指定手机上是使用前置还是后置的摄像头:

1 const isUseFront = true;
2 const options = {
3     video: {
4         facingMode: isUseFront ? 'user' : 'environment'
5     }
6 }

需要注意的是不是所有的浏览器都支持该API,比如反人类的IE,所以使用的时候还是需要考虑到兼容性的问题。

该API只能通过获取设备使用权,但是无法获取到具体的数据,比如音频数据。当我们需要实时获取到音频输入数据并进行对应操作的时候,这个API还无法满足我们的需求,这时候就需要另一个API:AudioContext 来对音频数据进行操作。对于AudioContext,目前还处于学习阶段,过段时间会有后续更新,敬请期待!