先说坏消息,苹果机没法玩这个!!!

而且,必须拥有 https 的安全协议!!!

而安卓机想完成这个功能倒是很 easy 的,看一眼代码

主要传入三个参数,配置对象,成功,失败

var mediaOpts = {
audio: false,
video: true,
}
function successFunc(stream) {
var video = document.querySelector('video');
if ("srcObject" in video) {
video.srcObject = stream
} else {
video.src = window.URL && window.URL.createObjectURL(stream) || stream
}
video.play();
}
function errorFunc(err) {
alert(err.name);
}

再使用 getUserMeida 就行了

navigator.getUserMedia(mediaOpts, successFunc, errorFunc);

但是,这个方法兼容性非常的非常不妙,所以我们需要加上一堆兼容代码

// getUserMedia 被标准废除了,mediaDevices 正在取代中
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function(constraints) {
var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
if (!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
}
return new Promise(function(resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
}
}
window.URL = (window.URL || window.webkitURL || window.mozURL || window.msURL);

  

至于开启的是前置还是后置摄像头,那就有些麻烦了,默认为打开前置摄像头(自拍的那个摄像头)。

腾讯的一个 H5 为我提供了这样的方法:

MediaStreamTrack.getSources(function(sourceInfos) {
for (var i = 0; i != sourceInfos.length; ++i) {
var sourceInfo = sourceInfos[i]; //这里会遍历audio,video,所以要加以区分
if (sourceInfo.kind === 'video') { exArray.push(sourceInfo.id); }
}
if (!navigator.getUserMedia) {alert('不支持 getUserMedia 方法')} mediaOpts.video = {
optional: [{
sourceId: exArray[1]
}]
}
navigator.getUserMedia(mediaOpts, successFunc, errorFunc);
});

官方 MDN 给出的是这样的办法:

mediaOpts.video = { facingMode: "environment"} // 或者 "user"

实验证明,后者并没有效果。

此处可见案例1案例2

以上,调取设备摄像头使用局限还是太多,

获取浏览器权限实属不易,更别提设备权限,微信等 api 提供的也仅是拍照和录像,

所以要完成实时的 AR 场景现在的 Web 技术还不足够。

要么转向 WebApp,要么用其他方案替代(如活动就只要拍照识别,苹果机使用全景虚拟场景等)。

手机调取摄像头问题(getUserMedia)的更多相关文章

  1. React Native学习-调取摄像头第三方组件:react-native-image-picker

    近期做的软件中图片处理是重点,那么自然也就用到了相机照相或者相册选取照片的功能. react-native中有image-picker这个第三方组件,但是0.18.10这个版本还不是太支持iPad. ...

  2. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式

    进入正题 1. PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video) <template> <div> &l ...

  3. Web调取摄像头拍照

    调取摄像头.拍照 <!doctype html> <html lang="en"> <head> <meta charset=" ...

  4. react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复

    在前几天用react-native进行android版本开发当中,用到了"react-native-image-picker"的插件:根据业务的需求:点击按钮-->直接调取摄 ...

  5. 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码

    接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...

  6. mui + H5 调取摄像头和相册 实现图片上传

    最近要用MUI做项目,在研究图片上传时 ,遇到了大坑 ,网上搜集各种资料,最终写了一个demo,直接看代码.参考(http://www.cnblogs.com/richerdyoung/p/66123 ...

  7. h5调用手机相册摄像头以及文件夹

    在之前一家公司的时候要做一个app里面有上传头像的功能,当时研究了好久,找到了一篇文章关于h5摄像头以及相册的调用的,所以就解决了这个问题了!!我这里记录一下以便后面有人需要,可以参考一下!!!! 下 ...

  8. h5调用手机前后摄像头,拍照

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="pacam.aspx.cs& ...

  9. html5调用手机本地摄像头和相册识别二维码详细实现过程

    项目中有用到h5识别我们的单据,单据上面有二维码. 实现的场景就是业务人员扫码 类似以下场景  业务员拿到单据以后,直接可以扫码进入相关单据业也可以 输入二维码下方的号码进行识别 下面是h5的页面构造 ...

随机推荐

  1. (转)java synchronised关键字

    转自:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html Java 多线程(六) synchronized关键字详解 Java ...

  2. Asp.net中使用文本框的值动态生成控件的方法

    这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...

  3. 鱼眼镜头的distortion校正【matlab】

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 作者:WWC %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  4. 上传图片到数据库,读取数据库中图片并显示(C#)

    from:http://blog.csdn.net/bfcady/article/details/2622701 思路:建立流对象,将上传图片临时保存到byte数组中,再用SQL语句将其保存到数据库中 ...

  5. 利用python输出000至999中间的数

    打造一个000-999的字典 ): : i = '+str(i) elif <=i and i<: i ='+str(i) else: i=str(i) with open('1.txt' ...

  6. IOS开发之自定义键盘

     本文转载至 http://blog.csdn.net/majiakun1/article/details/41242069 实际开发过程中,会有自定义键盘的需求,比如,需要添加一个表情键盘.本文提供 ...

  7. 用vector构造自动扩容的二维数组

    #include <iostream> #include <string> #include <vector> using namespace std; int m ...

  8. CodeForces 666B World Tour(spfa+枚举)

    B. World Tour time limit per test 5 seconds memory limit per test 512 megabytes input standard input ...

  9. 基于minikube的kubernetes集群部署及Vitess最佳实践

    简介 minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用: ...

  10. access variables from the global scope 在全局范围内访问变量的2种方法

    w http://php.net/manual/zh/language.variables.scope.php http://php.net/manual/en/language.variables. ...