zoukankan      html  css  js  c++  java
  • 手机调取摄像头问题(getUserMedia)

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

    而且,必须拥有 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,要么用其他方案替代(如活动就只要拍照识别,苹果机使用全景虚拟场景等)。

  • 相关阅读:
    计算器修正代码
    AsEnumrable和AsQueryable的区别
    c# 解释器模式与sping.net表达式的结合应用(金融里经常需要用到公式,这个公式是抽象的需要自己解释)
    Spring.net 间接调用被AOP拦截的方法失效(无法进入aop的拦截方法)
    信息熵公式的由来(转)
    期望风险、经验风险与结构风险之间的关系(转)
    梯度(转)
    奇特的数学问题(转)
    最大似然估计和最大后验估计(转)
    贝叶斯思想以及与最大似然估计、最大后验估计的区别(转)
  • 原文地址:https://www.cnblogs.com/foreverZ/p/6795986.html
Copyright © 2011-2022 走看看