小程序录制视频;10-30秒;需要拍摄人脸,大声朗读数字(123456)这种。

1.camera组件

camera页面内嵌的区域相机组件。注意这不是点击后全屏打开的相机

camera只支持小程序使用;官网链接

1.2 效果图

1.3 页面布局

camera 设置宽100%,高度通过uni.getSystemInfo获取,全屏展示。在通过定位把提示文字等信息放上去;

录制完毕,遮罩提示,完成录制,确认返回;

<template>
<view class="camera-position">
<camera device-position="front" flash="auto" @error="onCameraError"
:style="'width: 100%; height: '+ screenHeight +'px;'">
<!-- 人脸轮廓-图片 -->
<image src="../../static/face/face-avater.png" style="width: 100%; height: 55vh; margin:22vh 0 0 0;"
v-if="!achieveShow"></image>
</camera> <!-- 顶部提示信息 -->
<view class="camera-top text-center" v-show="!achieveShow">
<view class="text-lg text-red">
请面向屏幕
</view>
<view class="text-xl text-white margin-tb-xs">
<text class="text-lg">用普通话大声读</text>
<text class="text-red text-bold margin-left-xs">123456</text>
</view>
<view class="text-xxl text-red">
<text class="text-df text-white">倒计时</text>
<text class="text-red text-bold margin-lr-xs">{{totalSeconds}}</text>
<text class="text-df text-white">S</text>
</view>
</view> <!-- 完成拍摄 -->
<view class="achieve-shade" :style="'width: 100%; height: '+ screenHeight +'px;'" v-if="achieveShow">
<view class="" style="font-size: 120rpx;color: #1977FF;">
<text class="cuIcon-roundcheck"></text>
</view>
<view class="text-xl text-white margin-tb-sm">
已完成人脸识别
</view>
<button class="cu-btn line-blue round lg" @click="confirmBut">确定</button>
</view>
</view>
</template>

View

css样式

<style lang="scss" scoped>
.camera-position {
position: relative; .camera-top {
position: absolute;
left: 0;
top: 50rpx;
width: 100%;
} .camera-bottom {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
} .achieve-shade {
position: absolute;
left: 0;
top: 0;
background-color: rgba(222, 222, 222, 0.9);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center; button {
width: 300rpx;
}
}
}
</style>

css

js代码

<script>
export default {
data() {
return {
cameraContext: null,
//计时器
timer: null,
//录制时长
totalSeconds: 10,
//屏幕高度
screenHeight: "",
//是否显示-完成遮罩
achieveShow: false
}
},
onLoad() {
let that = this
uni.getSystemInfo({
success: (res) => {
console.log('屏幕宽度,单位为px:', res.windowWidth);
console.log('屏幕高度,单位为px:', res.windowHeight);
that.screenHeight = res.windowHeight;
},
}); setTimeout(() => {
this.startShoot()
}, 500)
},
onReady() {
// 创建 camera 上下文 CameraContext 对象
this.cameraContext = uni.createCameraContext()
},
methods: {
// 开始拍摄
startShoot() {
this.cameraContext.startRecord({
timeoutCallback: () => {
console.error('超出限制时长', this.totalSecond);
},
timeout: this.totalSeconds,
success: (res) => {
//开启计时器
this.timer = setInterval(() => {
this.totalSeconds--
}, 1000)
console.log(res, '开始拍摄');
},
fail: (err) => {
this.errToast('摄像头启动失败,请重新打开')
}
})
},
// 结束拍摄
stopShoot() {
// 接触 计时器
if (this.timer) clearInterval(this.timer) this.cameraContext.stopRecord({
compressed: true,
success: (res) => {
//显示遮罩
this.achieveShow = true
// TODO 获取数据帧
console.log(res, '结束拍摄');
},
fail: (err) => {
this.errToast('视频保存失败,请重新录制')
},
})
},
// 摄像头错误
onCameraError(error) {
console.error('摄像头错误: ', error.detail);
},
//摄像头-失败操作
errToast(e) {
this.$operate.toast({
title: e
})
setTimeout(() => {
this.confirmBut()
}, 500)
},
//确定-返回上一页
confirmBut() {
uni.navigateBack()
},
},
watch: {
//监听倒计时
totalSeconds: {
handler(newVal) {
// console.log(newVal, '倒计时');
//倒计时 = 1 的时候结束拍摄
if (newVal == 1) {
//结束拍摄
this.stopShoot()
}
}
}
}
}
</script>

js

注:第一次进入页面,有时候摄像头会启动失败,需要重新点击打开;

2.微信官方api

微信小程序中需要使用手机拍摄照片以及视频;使用wx.chooseMediaAPI来实现;

该API用于拍摄或从手机相册中选择图片或视频,官网链接为:wx.chooseMedia-微信开放文档

wx.chooseMedia({
//数量 1-9
count: 1,
//时长
maxDuration: '10',
// 文件类型 image 图片 video视频 mix同时选择图片和视频
mediaType: ['video'],
// 图片和视频选择的来源: album 相册 camera相机拍摄
sourceType: ['camera'],
//摄像头: back 前置 front 后置摄像头
camera: 'back',
success(res) {
console.log(res)
console.log(res.tempFiles[0].tempFilePath)
},
fail(err) {
console.log(err)
}
})

  

uni-app之camera组件-人脸拍摄的更多相关文章

  1. Hierarchy视图里的Transform和Camera组件

    Hierarchy视图里的Transform和Camera组件 在Hierarchy视图里,选中Camera,然后在Inspector视图里查看其各组件,如图1-8所示.对于Transform和Cam ...

  2. ionic3+angular4开发混合app 之自定义组件

    这里主要是记录ionic3+angular4开发混合app时自定义组件,我想自定义组件的方法和angular4应该类似,具体在纯angular4中自定义组件,暂时没有实践,个人觉得差别不大,之后实践了 ...

  3. Top Android App使用的组件(应用)

    Top Android App使用的组件   唱吧_462 smack:de.measite.smack:??? ???:org.apache:??? smack:org.jivesoftware.s ...

  4. uni app中使用自定义图标库

    项目中难免会用到自定义图标,那在uni app中应该怎么使用呢? 首先, 将图标目录放在static资源目录下: 在main.js中引入就可以全局使用了 import '@/static/icon-o ...

  5. uni app 零基础小白到项目实战-1

    uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...

  6. MUI开发APP,scroll组件,运用到区域滚动

    最近在开发APP的过程中,遇到一个问题,就是内容有一个固定的头部和底部.         头部就是我们常用的header了,底部的话,就放置一个button,用来提交页面数据或者进入下一个页面等,效果 ...

  7. 新闻类App使用的组件

    UI SlidingMenu:com.jeremyfeinstein.slidingmenu:滑动菜单 ActionBarSherlock:com.actionbarsherlock:Action B ...

  8. Top Android App使用的组件 2

    微信_355 SQLCipher:info.guardianproject.database:Android数据库加密 微博_650 点信传媒:cn.dx:广告平台 Apache HttpClient ...

  9. 外卖app的header组件开发

    1.webpack框架创建 # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpa ...

  10. [Learn AF3]第五章 App Framework 3组件之Drawer——Side Menu

    Drawer——Side menu 组件名称:Drawer     说明:af3中的side menu和af2中有很大变化,af3中的side menu实际上是通过插件$.afui.drawer来实现 ...

随机推荐

  1. VS2017 error CS0234: 命名空间“Microsoft”中不存在类型或命名空间名“Office”问题的一种解决方案

    最近需要使用VS2017编辑C#,但在编译时软件报错:error CS0234: 命名空间"Microsoft"中不存在类型或命名空间名"Office" 在网上 ...

  2. 组件中 data 为什么是一个函数?

    如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,对象没有自己的作用域,只有当两个实例拥有自己的作用域时,才不会相互干扰. 这是因为JavaScript的特性所导致 ...

  3. Vue 的父组件和子组件生命周期钩子函数执行顺序?

    https://www.cnblogs.com/thinheader/p/9462125.html 参考连接 Vue 的父组件和子组件生命周期钩子函数执行顺序可以归类为以下 4 部分: 加载渲染过程 ...

  4. SpringBoot 日志文件 logback-spring.xml

    日志文件 将logback-spring.xml配置文件,放到:/src/main/resources中 <?xml version="1.0" encoding=" ...

  5. Mybatis ResultMap复杂对象一对多查询结果映射之collection

    Mybatis复杂对象一对多映射配置ResultMap的collection collection:一对多查询结果映射,比如user有多个订单 表结构 项目结构图 pom.xml <?xml v ...

  6. Flask API 如何接入 i18n 实现国际化多语言

    ​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言. 用户请求 API 的多语言化其实有两种 ...

  7. jQuery中hide()和display的区别在于它们实现元素隐藏的方式不同。

    1. hide()方法是jQuery提供的一个函数,用于隐藏元素.当使用hide()方法时,元素会被设置为display:none,即不显示在页面上,但仍然占据着原来的空间.隐藏后的元素可以通过调用s ...

  8. oeasy教您玩转vim - 40 - # 复制粘贴

    ​ 复制粘贴 回忆上节课内容 我们上次的内容是粘贴 小写p意味着在光标下面或者后面粘贴 大写P意味着在光标上面或者前面粘贴 p的意思是放上去,就是put 把什么放上去呢? 把 reg 中 " ...

  9. AT_tenka1_2015_qualB_b 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个集合形式,判断此集合是 dict 还是 set. 思路 简单的模拟题. 首先需 ...

  10. bitwarden本地搭建(无需购买SSL证书)

    bitwarden本地搭建(无需购买SSL证书) 在安装之前,笔者在这里先声明一下,我安装bitwarden使用的操作环境为ArchLinux,我的想法是,因为这只是一个"密码本" ...