更新记录

1.0.0(2026-03-06)

支持 Android / iOS 原生相机预览 支持视频录制与录制进度回调 支持录制完成返回视频文件路径 支持前后摄像头切换


平台兼容性

uni-app(4.61)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.61)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × - ×

xx-face-recorder

xx-face-recorder 是一个 uni-app 原生录制组件,支持 Android / iOS。

  • 相机权限申请
  • 相机预览
  • 自动开始录制
  • 录制进度回调
  • 录制完成后输出视频路径
  • ref 方法调用示例

试用说明

  • 可以直接点击“试用插件”
  • 试用插件里的 index.nvue,包含页面样式、图标、音频和基础录制逻辑
  • 打自定义基座后运行模板页,控制台会直接打印录制文件
  • 简单、直接,方便二次接入

功能特性

  • 原生相机预览
  • 视频录制
  • 最大录制时长限制
  • 前后摄像头切换
  • 录制进度回调
  • 录制文件回调
  • iOS 文件路径兜底处理

安装

uni_modules/xx-face-recorder 目录复制到项目的 uni_modules 目录下。

模板页示例:

点击“试用插件”包含模板页面

权限要求

iOS

  • NSCameraUsageDescription
  • NSMicrophoneUsageDescription

Android

  • android.permission.CAMERA
  • android.permission.RECORD_AUDIO

说明:

  • mute=true 时,模板页默认不采集麦克风
  • 当前模板页默认传入的是 :mute="true"

组件用法

<xx-face-recorder
  ref="recorderRef"
  camera-position="front"
  resolution="720p"
  :mute="true"
  :max-duration-ms="8000"
  @ready="onRecorderReady"
  @recordstart="onRecordStart"
  @recordprogress="onRecordProgress"
  @recordfile="onRecordFile"
  @recordstop="onRecordStop"
  @error="onRecordError"
/>

Props

属性名 类型 默认值 说明
camera-position string front 摄像头位置,可选 front / back
resolution string 720p 分辨率,可选 720p / 1080p
mute boolean false 是否静音录制
max-duration-ms number 8000 最大录制时长,单位毫秒

API

事件

事件名 说明 常用字段
ready 相机预览就绪
recordstart 开始录制
recordprogress 录制进度更新 durationMs
recordfile 录制文件可用 filePathdurationMs
recordstop 录制停止 filePathdurationMs
error 异常回调 errCodeerrMsg

recordprogress 示例:

{
  "durationMs": 1600
}

recordfile / recordstop 示例:

{
  "filePath": "/path/to/face_xxx.mp4",
  "durationMs": 8000
}

补充:

  • Android 端可能额外返回 widthheightsizeBytes
  • iOS 端可能额外返回 path
  • 模板页实际主要使用 filePathdurationMs

方法

方法名 参数 说明
startPreview() 开始预览
stopPreview() 停止预览
startRecord() 开始录制
stopRecord() 停止录制
switchCamera(position) front / back 切换前后摄像头
getCurrentFilePath() 获取当前或最近一次录制文件路径

模板页字段

字段名 说明
maxDurationMs 最大录制时长
recorderMounted 组件是否已挂载
isIOS 当前是否为 iOS
recording 当前是否正在录制
elapsedMs 当前录制时长
statusText 页面状态提示文案
actionTip 当前动作提示文案
lastRecordFilePath 最近一次录制成功的视频文件路径
lastRecordDurationMs 最近一次录制成功的时长
audioMuted 当前是否静音

重点字段:

lastRecordFilePath

  • 最近一次录制成功后得到的视频文件路径
  • 上传、预览、调试都可以直接用它

lastRecordDurationMs

  • 最近一次录制成功的时长,单位毫秒
  • 常用于展示录制结果或业务上报

模板页示例方法

模板页里保留了几组最常见的调用示例:

方法名 说明
startPreviewExample() 手动开始预览示例
stopPreviewExample() 手动停止预览示例
startRecordExample() 手动开始录制示例
stopRecordExample() 手动停止录制示例
switchToFrontCamera() 切换前置摄像头示例
switchToBackCamera() 切换后置摄像头示例
restartRecord() 重新录制示例

使用示例

1. 通过 ref 调用方法

const recorder = this.$refs.recorderRef

recorder.startPreview()
recorder.startRecord()
recorder.stopRecord()
recorder.switchCamera('back')

const filePath = recorder.getCurrentFilePath()
console.log('当前文件路径:', filePath)

2. 只打印录制结果

async onRecordFile(evt) {
  const filePath = await this.resolveRecordFilePath(evt)
  const durationMs = this.extractDurationMs(evt)
  console.log('录制文件路径:', filePath)
  console.log('录制时长:', durationMs)
}

3. 录制完成后预览视频

async onRecordStop(evt) {
  const filePath = await this.resolveRecordFilePath(evt)
  if (!filePath) return

  uni.previewMedia({
    current: 0,
    sources: [
      {
        url: filePath,
        type: 'video',
      },
    ],
  })
}

模板页关键方法

这些方法建议保留:

  • normalizeEventPayload
  • readPayloadValue
  • resolveRecordFilePath
  • ensureCameraPermission
  • handleRecordResult

控制台日志

  • [identification][permission-result]
  • [identification][ready]
  • [identification][record-start]
  • [identification][record-stop]
  • [identification][record-file-ready]
  • [identification][record-error]
  • [identification][record-file]

隐私、权限声明

1. 本插件需要申请的系统权限列表:

`iOS: NSCameraUsageDescription(相机权限):用于相机预览和视频录制。 NSMicrophoneUsageDescription(麦克风权限):当组件 mute=false 时,用于录制音频。 Android: android.permission.CAMERA(相机权限):用于相机预览和视频录制。 android.permission.RECORD_AUDIO(麦克风权限):当组件 mute=false 时,用于录制音频。`

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

本插件不采集任何数据,不向任何服务器发送数据。 插件仅调用系统相机/录制能力,在设备本地生成视频文件,供开发者自行处理。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: