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

1.camera组件

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

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

1.2 效果图

1.3 页面布局

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

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


<template>
    <viewclass="camera-position">
        <cameradevice-position="front"flash="auto"@error="onCameraError":style="'width: 100%; height: '+ screenHeight +'px;'">
            <!--人脸轮廓-图片-->
            <imagesrc="../../static/face/face-avater.png"style="width: 100%; height: 55vh; margin:22vh 0 0 0;"v-if="!achieveShow"></image>
        </camera>

        <!--顶部提示信息-->
        <viewclass="camera-top text-center"v-show="!achieveShow">
            <viewclass="text-lg text-red">请面向屏幕</view>
            <viewclass="text-xl text-white margin-tb-xs">
                <textclass="text-lg">用普通话大声读</text>
                <textclass="text-red text-bold margin-left-xs">123456</text>
            </view>
            <viewclass="text-xxl text-red">
                <textclass="text-df text-white">倒计时</text>
                <textclass="text-red text-bold margin-lr-xs">{{totalSeconds}}</text>
                <textclass="text-df text-white">S</text>
            </view>
        </view>

        <!--完成拍摄-->
        <viewclass="achieve-shade":style="'width: 100%; height: '+ screenHeight +'px;'"v-if="achieveShow">
            <viewclass=""style="font-size: 120rpx;color: #1977FF;">
                <textclass="cuIcon-roundcheck"></text>
            </view>
            <viewclass="text-xl text-white margin-tb-sm">已完成人脸识别</view>
            <buttonclass="cu-btn line-blue round lg"@click="confirmBut">确定</button>
        </view>
    </view>
</template>

View

注:行内css
text-xl text-white margin-tb-xs
使用了
ColorUI-UniApp
插件内容

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>exportdefault{
data() {
return{
cameraContext:
null,//计时器 timer: null,//录制时长 totalSeconds: 10,//屏幕高度 screenHeight: "",//是否显示-完成遮罩 achieveShow: false}
},
onLoad() {
let that
= thisuni.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.chooseMedia
API来实现;

该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)
	}
})

标签: none

添加新评论