更新记录
1.1.2(2026-10-31)
兼容蒸汽模式 自动对焦 优化分发 ipa 路径问题
平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | √ | × | × | × | × | √ | √ | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.26)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | √ | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
UTS 人脸引导视频录制(自动对焦、前后摄像头)
用于人脸引导视频采集,保留圆形取景框、眨眼/张嘴文字和语音提示、重新录制、视频预览与保存相册。组件提供原生相机预览和录像,不进行人脸识别或活体判定。
| 支持项目 | 页面 | 平台 |
|---|---|---|
| uni-app x Vapor | .uvue |
Android / iOS |
| uni-app x VDOM | .uvue |
Android / iOS |
HBuilderX 5.26+;Android 6.0+ / iOS 15.0+;版本 1.1.2。本目录是 uni-app x 的标准组件入口。普通 uni-app 使用同步维护的 austin-face-recorder,放在 .nvue 页面;其录制参数、事件和六个方法保持一致。普通 .vue 页面需跳转到 .nvue 录制页。
第 1 步:放入插件
将整个 austin-face-rec-x 目录放到项目的 uni_modules 下,保留其中的 components、utssdk、static 文件。
业务页面导入的是 组件文件,完整路径为:
import AustinFaceRecX from '@/uni_modules/austin-face-rec-x/components/austin-face-rec-x/austin-face-rec-x.uvue'
不需要在业务页面直接导入 utssdk 内的原生文件。
第 2 步:接入页面
最小示例:
<template>
<view class="page">
<austin-face-rec-x
ref="recorderRef"
class="camera"
cameraPosition="front"
resolution="720p"
focusMode="continuous"
:mute="true"
:maxDurationMs="8000"
:previewCornerRadiusRate="0.5"
@recordfile="onRecordFile"
@error="onRecordError"
/>
<button @click="startRecord">开始录制</button>
<button @click="stopRecord">结束录制</button>
</view>
</template>
<script setup lang="uts">
import { ref, ComponentPublicInstance } from 'vue'
import AustinFaceRecX from '@/uni_modules/austin-face-rec-x/components/austin-face-rec-x/austin-face-rec-x.uvue'
const recorderRef = ref<ComponentPublicInstance | null>(null)
function startRecord(): void {
recorderRef.value?.$callMethod('startRecord')
}
function stopRecord(): void {
recorderRef.value?.$callMethod('stopRecord')
}
function recorderData(event: any | null): UTSJSONObject | null {
if (event == null) return null
if (event instanceof UTSJSONObject) {
const object = event as UTSJSONObject
return object.getJSON('detail') ?? object
}
return (event as UniCustomEvent<UTSJSONObject>).detail
}
function onRecordFile(event: any | null): void {
const result = recorderData(event)
if (result == null) return
const filePath = result.getString('filePath') ?? ''
const durationMs = result.getNumber('durationMs') ?? 0
console.log(filePath, durationMs)
// 这里取得的是完成文件。上传用原路径,video 预览需转换 file://,见下方说明。
}
function onRecordError(event: any | null): void {
const error = recorderData(event)
if (error == null) return
uni.showToast({ title: error.getString('errMsg') ?? '录制失败', icon: 'none' })
}
</script>
<style>
.page { flex: 1; padding: 20px; }
.camera { width: 300px; height: 300px; }
</style>
组件挂载后自动准备预览并申请相机权限。需要在相机准备完成后自动录像时,监听 ready 再调用 startRecord();插件附带的完整演示页已接好。
要直接使用原版引导布局,在项目 pages.json 中增加:
{
"path": "uni_modules/austin-face-rec-x/index",
"style": { "navigationBarTitleText": "人脸引导视频录制", "disableScroll": true, "pageOrientation": "auto" }
}
该页内置视频预览,不依赖项目另建预览页;图标和语音均来自插件自己的 static 目录。
第 3 步:权限与基座
| 平台 | 录制权限 | 配置位置 |
|---|---|---|
| Android | CAMERA,非静音时还需 RECORD_AUDIO |
插件自动合并权限,组件按需申请;项目不用重复添加 |
| iOS | 相机、非静音录像时的麦克风用途 | 插件 Info.plist 已提供基础用途并自动合并;可在项目根目录 Info.plist 中按实际业务覆盖用途文案 |
如果使用演示页的 保存相册 按钮,在项目根目录创建 Info.plist,添加以下相册用途;已有该文件时,只合并 <dict> 内的键,不覆盖其他配置。不使用保存相册时可跳过。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>用于将用户主动保存的录制视频写入相册</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>用于用户主动保存和查看录制视频</string>
</dict>
</plist>
配置位置见 DCloud iOS 原生配置说明。
首次导入或更新原生代码后,重新制作并安装包含本插件的自定义基座,再运行 .uvue 页面。正式包使用相同的插件与权限配置;iOS 真机打包仍使用项目自己的签名证书和描述文件。
相机画面、录制清晰度与对焦效果需要有摄像头的设备。模拟器只能覆盖其支持的相机与文件流程,iOS 模拟器没有可用摄像头时会返回错误。
第 4 步:体验与调整
打开演示页并允许相机权限,按原有流程自动开始录制,依次显示正脸、眨眼和张嘴提示。录制结束后可预览、保存或重新录制。
| 调整项 | 修改位置 |
|---|---|
| 录制时长 | 演示页 maxDurationMs,默认 8000 毫秒;15000 为 15 秒、30000 为 30 秒 |
| 圆形/方形取景框 | 演示页 maskCornerRadiusRpx:250 为圆,0 为方形,中间值为圆角 |
| 录音 | 组件 mute:演示页默认 true,即视频不采集麦克风;语音引导按钮仅控制提示音 |
| 视频清晰度 | 组件 resolution:720p 或 1080p |
| 对焦 | 组件 focusMode:默认 continuous,设备支持时使用持续自动对焦 |
分辨率不会替代对焦。部分前置摄像头为固定焦距,不能强制提供硬件不支持的自动对焦;设备不支持指定分辨率或对焦模式时按可用能力处理,视频实际像素见完成事件的 width、height。
横屏录制
- 在
pages.json的录制页style中设置"pageOrientation": "auto"随设备旋转;固定横屏使用"landscape",固定竖屏使用"portrait"。 - iOS 项目若限制了方向,在项目根目录
Info.plist的<dict>内合并下列配置,并重新打基座。已有该键时只补齐横屏项;iPad 同理使用UISupportedInterfaceOrientations~ipad。
<key>UISupportedInterfaceOrientations~iphone</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
录制前先转到目标方向。每段视频固定使用开始时的方向,录制中转屏不会旋转已开始的片段;下一次录制采用新方向。演示页横屏为相机左侧、引导和操作右侧,竖屏保留原布局。视频带方向信息,预览与上传使用原文件,不要根据 orientationDegrees 再次旋转。
页面配置见 DCloud 横竖屏配置。
Props
建议沿用示例中的 camelCase 属性名。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cameraPosition |
string |
front |
front 前置、back 后置 |
resolution |
string |
720p |
目标分辨率,支持 720p / 1080p |
focusMode |
string |
continuous |
continuous 持续自动对焦;auto 单次自动对焦;locked 使用设备支持的固定/锁定对焦模式 |
mute |
boolean |
false |
true 时不采集麦克风;演示页显式设为 true |
maxDurationMs |
number |
8000 |
开始录制前设置的最大时长,单位毫秒,如 15000 为 15 秒,到时自动结束;iOS 最长 1 小时 |
previewCornerRadiusRate |
number |
0.5 |
预览裁切圆角比例,范围 0~0.5;0.5 为圆形,0 为方形。只改变预览形状,不把视频裁成圆形 |
组件方法
通过组件 ref 的 $callMethod() 调用,方法名保持原版:
| 方法 | 参数 | 返回 | 说明 |
|---|---|---|---|
startPreview() |
无 | void |
准备或恢复原生相机预览 |
stopPreview() |
无 | void |
停止预览;业务页面离开时调用 |
startRecord() |
无 | void |
开始一次录像,完成与失败通过事件通知 |
stopRecord() |
无 | void |
请求结束录像;必须等待完成事件后再读取、上传视频或开始下一次录像 |
switchCamera(position) |
front / back |
void |
切换前后摄像头,建议在未录制时调用 |
getCurrentFilePath() |
无 | string |
最近一次已经完成并可读取的视频地址。录制或封装过程中返回上一条结果或空字符串;新成片以完成事件为准 |
事件
| 事件 | 常用字段 | 时机 |
|---|---|---|
ready |
原生端实际能力信息 | 相机预览就绪,可调用 startRecord() |
recordstart |
无需读取文件字段 | 录制已开始 |
recordprogress |
durationMs |
录制期间更新时长,单位毫秒 |
recordfile |
下表中的完成结果 | 视频文件已完成并通过校验 |
recordstop |
同一次录制的完成结果 | 视频录制结束且文件可用 |
error |
errCode、errMsg |
权限或录制失败 |
平台的 recordfile、recordstop 先后顺序可能不同。业务选择一个完成事件处理即可;同时监听时按 filePath 去重,避免重复上传。
ready 的可选能力字段
| 字段 | 类型 | 平台 | 说明 |
|---|---|---|---|
focusMode |
string |
Android | 实际采用的相机原生对焦模式,如 continuous-video、auto 或 fixed |
previewWidth |
number |
Android | 预览像素宽度,不等同于最终录像宽度 |
previewHeight |
number |
Android | 预览像素高度 |
focusSupported |
boolean |
iOS | 当前摄像头是否支持持续自动对焦 |
resolution |
string |
iOS | 实际采用的 AVFoundation session preset 标识 |
完成结果字段
| 字段 | 类型 | 说明 |
|---|---|---|
filePath |
string |
当前应用沙盒内的视频绝对路径,用于读取、上传和保存;video 预览按下方转换为文件 URI |
path |
string |
filePath 的兼容别名,保留旧业务用法 |
uploadFilePath |
string |
同一成片的可上传本地路径,可用于 uni.uploadFile.filePath |
durationMs |
number |
实际录制时长,单位毫秒 |
width |
number |
视频宽度,像素;Android 为编码宽度,iOS 为应用轨道变换后的显示宽度 |
height |
number |
与 width 对应的视频高度,像素 |
sizeBytes |
number |
成片文件大小,单位字节 |
orientationDegrees |
number |
平台方向标记:Android 为写入录像的旋转提示;iOS 为界面方向(竖0、右横90、倒竖180、左横270)。供诊断,不用于二次旋转 |
relativePath |
string |
插件输出目录内的相对地址,原生端提供时返回 |
relativeFilePath |
string |
Android 提供的相对地址字段,与 iOS 的 relativePath 用途相同 |
tempFilePath |
string |
iOS 兼容别名,指向同一成片 |
fileURL |
string |
iOS 的 file:// 地址;上传仍优先使用 filePath |
iOS 通过系统录制完成回调生成结果,不再按“文件是否已出现”猜测完成。成功事件返回的是已经写完、可读取且非空的视频,不要自行改成 _doc/face_record.mp4,也不要拼接 Pandora、AppID 或应用容器目录。
预览时只转换播放器的 src,不要修改上传使用的 filePath。附带演示页已处理:
const videoSrc = filePath.startsWith('/') ? 'file://' + filePath : filePath
// <video :src="videoSrc" />
// uni.uploadFile({ filePath, ... }) 继续使用原路径。
绝对沙盒路径不是永久网络地址。需要长期保存时由业务管理文件与相对标识;不要跨安装、升级直接复用旧容器的绝对地址。上传、预览或保存完成后,文件清理也由业务按需处理。
错误字段
| 字段 | 类型 | 说明 |
|---|---|---|
errCode |
number |
错误码 |
errMsg |
string |
当前错误的具体原因 |
| 错误码 | 说明 |
|---|---|
10001 |
相机或麦克风权限未授权 |
10002 |
相机初始化、录像或文件处理失败,查看 errMsg |
10003 |
用户取消相关操作 |
10004 |
当前平台不支持 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 642
赞赏 4
下载 12730669
赞赏 1959
赞赏
京公网安备:11010802035340号