记录--h5调用手机摄像头踩坑

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

1. 背景

一般业务也很少接触摄像头,有也是现成的工具库扫个二维码。难得用一次,记录下踩坑。

2.调用摄像头的方法

2.1. input

<!-- 调用相机 -->
<input type="file" accept="image/*" capture="camera">
<!-- 调用摄像机 -->
<input type="file" accept="video/*" capture="camcorder">
<!-- 调用录音机 -->
<input type="file" accept="audio/*" capture="microphone">

这个就不用多说了,缺点就是没办法自定义界面,它是调用的系统原生相机界面。

2.2. mediaDevices

由于我需要自定义界面,就像下面这样:

所以我选择了这个方案,这个api使用起来其实很简单:

<!-- 创建一个video标签用来播放摄像头的视屏流 -->
<video id="video" autoplay="autoplay" muted width="200px" height="200px"></video>
<button onclick="getMedia()">开启摄像头</button>
async getMedia() {
    // 获取设备媒体的设置,通常就video和audio
    const constraints = {  
    // video配置,具体配置可以看看mdn
        video: {  
            height: 200,  
            wdith: 200,  
        },  
    // 关闭音频
        audio: false  
    };  
    this.video = document.getElementById("video");  
    // 使用getUserMedia获取媒体流
    // 媒体流赋值给srcObject
    this.video.srcObject = await window.navigator.mediaDevices.getUserMedia(constraints);
    // 直接播放就行了
    this.video.play();  
}

可以看到这个效果。

这个api的配置可以参考MDN

// 截图拍照
takePhoto() {  
    const video = document.getElementById("video");  
    // 借助canvas绘制视频的一帧
    const canvas = document.getElementById("canvas");  
    const ctx = canvas.getContext('2d');  
    ctx.drawImage(this.video, 0, 0, 300, 300);  
},
// 停止
stopMedia() {  
    // 获取媒体流
    const stream = this.video.srcObject;  
    const tracks = stream.getTracks();  
    // 停止所有轨道
    tracks.forEach(function (track) {  
        track.stop();
    })  
    this.video.srcObject = null;  
}

3.坑

如果你复制我的代码,在localhost上肯定能运行,但是你想在手机上试试的时候就会发现很多问题。

3.1. 需要https

由于浏览器的安全设置,除了localhosthttps连接,你都没办法获取到navigator.mediaDevices,打印出来是undefined。如果要在手机上测试,你要么用内网穿透代理一个https,要么部署在https域名的服务器上测试。

3.2. 设置前后摄像头

默认是使用user设备,也就是前摄像头,想要使用后摄像头也是有配置的,

async getMedia() {
    // ...
    let constraints = {  
        video: {  
            height: 200,  
            wdith: 200,  
            // environment设备就是后置
            facingMode: { exact: "environment" },  
        },  
        audio: false  
    };
    // ...
}

3.3. 设置显示区域大小

我的需求是铺满整个设备,所以我想当然的直接把video样式宽高设置成容器大小:

#video {
    width: 100%;
    height: 100%;
}


async getMedia() {
    // ....
    // 将宽高设置成容器大小
    const pageSize = document.querySelector('.page').getBoundingClientRect()  
    let constraints = {  
    video: {  
            height: pageSize.height,  
            width: pageSize.width,  
            facingMode: { exact: "environment" },
        },  
        audio: false  
    };
    //....
}

发现这个视频横着而且没有铺满屏幕。

通过输出video的信息可以看到,设备返回的视频流宽高是反的:

 所以配置换一下就行了:

    let constraints = {  
        video: {  
            height: pageSize.width,  
            width: pageSize.height,  
        },  
    };

本文转载于:

https://juejin.cn/post/7287965561035210771

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在H5端调用摄像头,可以使用HTML5的WebRTC技术,通过getUserMedia API来获取用户媒体设备,包括摄像头、麦克风等。 在uni-app中,你可以使用uni-app提供的uni-app-plus插件来实现在H5端调用摄像头的功能。 首先,在uni-app项目中,需要安装uni-app-plus插件。可以在项目根目录下执行以下命令进行安装: ``` npm install @dcloudio/uni-app-plus --save ``` 安装完成后,在需要使用摄像头的页面中,引入plus对象,并调用plus.camera.getCamera()方法来获取摄像头的实例: ```javascript import uni from 'uni-app-plus'; const plus = uni.requireNativePlugin('plus'); const camera = plus.camera.getCamera(); ``` 获取到摄像头实例后,可以使用startPreview()方法来启动摄像头预览: ```javascript camera.startPreview({ index: 0, // 指定摄像头的索引,0为后置摄像头,1为前置摄像头 resolution: 'high', // 指定摄像头分辨率 format: 'jpg', // 指定预览图片的格式 success: function() { console.log('启动摄像头成功'); }, fail: function(err) { console.error('启动摄像头失败:' + err.message); } }); ``` 启动摄像头预览后,可以使用takePicture()方法来拍照: ```javascript camera.takePicture({ quality: 80, // 拍照图片质量 success: function(image) { console.log('拍照成功,图片地址为:' + image); }, fail: function(err) { console.error('拍照失败:' + err.message); } }); ``` 拍照成功后,可以通过返回的image参数获取到拍摄的照片地址。 需要注意的是,使用WebRTC技术获取用户媒体设备需要用户授权,因此在调用摄像头前,需要先请求用户授权。可以使用uni-app提供的uni.authorize()方法来请求用户授权: ```javascript uni.authorize({ scope: 'scope.camera', success: function() { console.log('用户授权成功'); // 调用摄像头相关方法 }, fail: function(err) { console.error('用户授权失败:' + err.message); } }); ``` 以上就是在uni-app中在H5端调用摄像头的基本流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值