更新记录
1.0.0(2026-09-29)
- 首次发布:打开/关闭摄像头、预览、拍照、录像、RTMP 推流、设备枚举与切换、分辨率读写、旋转镜像、亮度/对比度百分比及 25 项 UVC 参数通用 get/set/reset
平台兼容性
uni-app(4.72)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | × | × | × | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.72)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | × | × | × |
zy-uvc-plus
基于 UVCAndroid 的 USB 摄像头增强插件,提供打开/关闭摄像头、预览、拍照、录像、RTMP 推流、多设备枚举与切换、分辨率控制、镜像旋转,以及全部 UVC 参数(含百分比)的通用读写能力。
特性
- USB 摄像头即插即用(需设备支持 USB Host/OTG)
- 打开 / 关闭摄像头、开启 / 关闭预览
- 拍照(JPEG,可选时间戳水印)、录像(MP4,可选音频)
- 获取摄像头列表、按设备名/ID/名称/下标切换摄像头
- 获取支持的分辨率 / 当前分辨率 / 动态设置分辨率
- 预览旋转(0/90/180/270)、镜像模式(正常/水平/垂直/水平垂直)
- 亮度、对比度百分比获取与设置(通用百分比接口同时支持其余参数)
- 通用 UVC 参数 get/set:25 个参数(含范围、当前值、百分比、默认值)
- RTMP 推流:把摄像头画面 H.264 + 麦克风 AAC 推流到 rtmp 服务器
- 统一事件回调(同步/异步结果统一走
@onResult,设备状态走@onDeviceState)
平台支持
| 平台 | 支持 |
|---|---|
| Android | ✓ |
| iOS | ✗ |
| H5 | ✗ |
| 小程序 | ✗ |
最低 Android SDK 版本:21(Android 5.0)
快速开始
引入组件
<zy-uvc-plus
ref="uvc"
class="camera"
@onResult="onResult"
@onDeviceState="onDeviceState">
</zy-uvc-plus>
打开摄像头并预览
// 自动选择第一个 USB 摄像头,打开后自动开启预览
this.$refs.uvc.openCamera()
// 指定设备名 / 产品名 / 下标,并指定期望分辨率
this.$refs.uvc.openCamera({
deviceName: '/dev/bus/usb/001/002',
size: [1280, 720],
autoPreview: true
})
拍照
this.$refs.uvc.takePicture()
// 结果: { uri, path },文件保存在 {app-files-dir}/uvcPlus/
this.$refs.uvc.takePicture({ addTimestamp: true, timestampFormat: 'formatted' })
this.$refs.uvc.takePicture({ fileName: 'my.jpg' })
录像
this.$refs.uvc.startRecord({ audio: true, bitRate: 640000, frameRate: 25 })
this.$refs.uvc.stopRecord()
// 结果: { uri, path },文件保存在 {app-files-dir}/uvcPlus/
参数调节
// 百分比(0-100)
this.$refs.uvc.getBrightnessPercent()
this.$refs.uvc.setBrightnessPercent(80)
this.$refs.uvc.getContrastPercent()
this.$refs.uvc.setContrastPercent(50)
// 通用参数
this.$refs.uvc.getAllParams()
this.$refs.uvc.getParam('whiteBalance')
this.$refs.uvc.setParam('saturation', 64)
this.$refs.uvc.getParamPercent('exposureTime')
this.$refs.uvc.setParamPercent('exposureTime', 30)
this.$refs.uvc.resetParams()
RTMP 推流
// 开始推流(需摄像头已打开且预览中;audio 默认 true,首次会申请录音权限)
this.$refs.uvc.startPush({ url: 'rtmp://server/live/stream', audio: true })
// 仅推视频
this.$refs.uvc.startPush({ url: 'rtmp://server/live/stream', audio: false })
// 自定义码率/帧率/音频参数
this.$refs.uvc.startPush({
url: 'rtmp://server/live/stream',
videoBitrate: 2000000,
fps: 25,
audioSampleRate: 44100,
audioChannels: 1,
audioBitrate: 64000
})
this.$refs.uvc.stopPush()
this.$refs.uvc.isPushing()
推流状态通过 @onDeviceState 下发:onPushStart(已连接)、onPushStop(已停止)、onPushError(连接/编码失败,code 9010011/9010012)、onPushAudioError(音频采集失败,code 9010013,不影响视频推流)。
推流依赖
libs/rtmpservice.aar(内含 librtmp_stream.so),需使用自定义基座;关闭摄像头、拔出设备或页面卸载时会自动停止推流。
分辨率 / 旋转镜像
this.$refs.uvc.getSupportedResolutions()
this.$refs.uvc.getCurrentResolution()
this.$refs.uvc.setResolution({ width: 1920, height: 1080 })
this.$refs.uvc.setRotation(90)
this.$refs.uvc.setMirror(1) // 0正常 1水平 2垂直 3水平垂直
this.$refs.uvc.getPreviewConfig()
API
所有方法均为「事件回调式」:方法调用后通过 @onResult 返回结果,结构为 { type: 方法名, data: { code, msg, data } },code === 0 表示成功。
事件
@onResult
方法调用与异步操作的统一回调。
onResult(e) {
const { type, data } = e.detail
if (data.code !== 0) {
uni.showToast({ title: data.msg, icon: 'none' })
return
}
switch (type) {
case 'openCamera': break
case 'getCameraList': break
case 'takePicture': break
case 'startRecord': break
case 'stopRecord': break
case 'getAllParams': break
// ...
}
}
type 取值:openCamera、closeCamera、startPreview、stopPreview、getCameraList、switchCamera、getSupportedResolutions、getCurrentResolution、setResolution、setRotation、setMirror、getPreviewConfig、isCameraOpen、takePicture、startRecord、stopRecord、getAllParams、getParam、setParam、getParamPercent、setParamPercent、resetParams、getBrightnessPercent、setBrightnessPercent、getContrastPercent、setContrastPercent、startPush、stopPush、isPushing。
@onDeviceState
USB / 摄像头状态变化回调,结构同上。
| type | 说明 |
|---|---|
onAttach |
USB 设备接入 |
onDetach |
USB 设备拔出(code=9010001) |
onDeviceOpen |
USB 设备已打开 |
onDeviceClose |
USB 设备已关闭 |
onCameraOpen |
摄像头已打开 |
onCameraClose |
摄像头已关闭 |
onCancel |
用户取消授权(code=9010001) |
onError |
打开出错(code=9010002) |
onPushStart |
RTMP 已连接,开始推流 |
onPushStop |
推流已停止 |
onPushError |
推流连接/编码失败(code=9010011/9010012) |
onPushAudioError |
音频采集/编码失败(code=9010013,不影响视频推流) |
方法
| 方法 | 说明 | data 成功载荷 |
|---|---|---|
openCamera(options?) |
打开摄像头(先校验 CAMERA/RECORD_AUDIO 权限,缺失则自动请求;成功后默认自动预览) | { deviceName, previewing } |
closeCamera() |
关闭摄像头(自动停止录像与推流) | {} |
startPreview() / stopPreview() |
开启 / 关闭预览 | { previewing } |
getCameraList() |
枚举 USB 摄像头 | { count, devices[], currentDeviceName } |
switchCamera(options?) |
切换摄像头(不传参数按顺序轮换;同样先校验权限) | { switched, deviceName } |
getSupportedResolutions() |
支持的分辨率列表 | { count, sizes[] } |
getCurrentResolution() |
当前分辨率 | { width, height, type, fps, fpsList[] } |
setResolution(size) |
动态设置分辨率(自动重启预览) | 同 getCurrentResolution |
setRotation(rotation) |
预览旋转,0/90/180/270 | { rotation } |
setMirror(mirror) |
镜像,0正常/1水平/2垂直/3水平垂直 | { mirror } |
getPreviewConfig() |
获取旋转与镜像配置 | { rotation, mirror } |
isCameraOpen() |
查询状态 | { isOpen, isPreviewing, isRecording, deviceName } |
takePicture(options?) |
拍照(异步) | { uri, path } |
startRecord(options?) |
开始录像(异步) | { path } |
stopRecord() |
结束录像(异步,结果由 onVideoSaved 回传) |
{ uri, path } |
getAllParams() |
全部参数(含范围/百分比) | { count, params[] } |
getParam(name) |
读取单个参数 | { name, current, percent, min, max, def, ... } |
setParam(name, value) |
设置单个参数原始值 | 同 getParam |
getParamPercent(name) / setParamPercent(name, percent) |
百分比读写(0-100) | 同 getParam |
resetParams() |
重置全部支持的参数为默认值 | { count } |
getBrightnessPercent() / setBrightnessPercent(percent) |
亮度百分比快捷接口 | 同 getParam |
getContrastPercent() / setContrastPercent(percent) |
对比度百分比快捷接口 | 同 getParam |
startPush(options) |
开始 RTMP 推流(需摄像头已打开且预览中,否则返回 9010006/9010008;异步结果看 onPushStart/onPushError) |
{} |
stopPush() |
停止 RTMP 推流 | {} |
isPushing() |
查询推流状态 | { pushing } |
options 参数
openCamera / switchCamera:
| 字段 | 类型 | 说明 |
|---|---|---|
deviceName |
string | 设备节点名,如 /dev/bus/usb/001/002 |
deviceId |
number | UsbDevice.deviceId |
productName |
string | 产品名 |
index |
number | 列表下标 |
size |
number[] | [width, height],openCamera 专属,期望分辨率 |
autoPreview |
boolean | openCamera 专属,默认 true |
takePicture:addTimestamp(是否加水印)、timestampFormat(raw/formatted)、fileName(自定义文件名)。
startRecord:audio(默认 true)、bitRate(默认 1024*1024*25*0.25 ≈ 6.5Mbps)、frameRate(默认 25)。
支持的 UVC 参数
数值型(19 个):brightness 亮度、contrast 对比度、saturation 饱和度、hue 色调、sharpness 锐度、gamma Gamma、whiteBalance 白平衡、gain 增益、backlightComp 背光补偿、exposureTime 曝光时间、focus 焦距、zoom 变焦、pan 水平、tilt 垂直、roll 滚转、iris 光圈、powerlineFrequency 电源频率、autoExposureMode 曝光模式、digitalMultiplier 数字增益。
布尔型(6 个):focusAuto 自动对焦、hueAuto 色调自动、whiteBalanceAuto 白平衡自动、contrastAuto 对比度自动、exposureTimeAuto 曝光自动、privacy 隐私遮蔽。
参数项结构:
{
name: 'brightness',
label: '亮度',
supported: true,
isBool: false,
current: 128,
percent: 50,
min: 0,
max: 255,
def: 128
}
注:
setPercent/getPercent会先刷新对应参数的取值范围(updateXxxLimit),亮度等参数因此可正确换算。
错误码
| 错误码 | 说明 |
|---|---|
| 9010001 | 设备未连接 |
| 9010002 | 打开摄像头失败 |
| 9010003 | 拍摄失败 |
| 9010004 | 录制失败 |
| 9010005 | 操作超时 |
| 9010006 | 摄像头未打开 |
| 9010007 | 不支持的参数 |
| 9010008 | 预览操作失败 |
| 9010009 | 入参无效 |
| 9010011 | 推流连接失败 |
| 9010012 | 推流编码失败 |
| 9010013 | 录音权限被拒绝 |
| 9010014 | 摄像头/录音权限被拒绝 |
注意事项
- 组件根节点是一个原生预览 Surface,需设置宽高(如
width: 100%; height: 400px),否则画面不显示。 openCamera/switchCamera会先校验CAMERA、RECORD_AUDIO运行时权限,未授权时自动弹出系统授权框;被拒绝返回 9010014。- 组件销毁(
NVBeforeUnload/unmounted)时自动停止录像、停止推流并释放摄像头资源。 - 多实例同时使用时建议每页仅放置一个组件实例(内部资源为全局单例)。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 47
赞赏 0
下载 12646447
赞赏 1952
赞赏
京公网安备:11010802035340号