uni-app之camera元件-人臉拍攝

虚乄發表於2024-08-30

小程式錄制影片;10-30秒;需要拍攝人臉,大聲朗讀數字(123456)這種。

1.camera元件

camera頁面內嵌的區域相機元件。注意這不是點選後全屏開啟的相機

camera只支援小程式使用;官網連結

1.2 效果圖

1.3 頁面佈局

camera 設定寬100%,高度透過uni.getSystemInfo獲取,全屏展示。在透過定位把提示文字等資訊放上去;

錄製完畢,遮罩提示,完成錄製,確認返回;

uni-app之camera元件-人臉拍攝
<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樣式

uni-app之camera元件-人臉拍攝
<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程式碼

uni-app之camera元件-人臉拍攝
<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)
	}
})

  

相關文章