React Native能否同时启用前后置摄像头?react-native-camera使用问题
这个问题其实是iOS系统层面的限制导致的,我来给你拆解下原因和解决办法:
首先,你当前的代码里放了两个<RNCamera>组件,但在iOS上,系统的AVFoundation框架默认不允许同时运行多个独立的摄像头捕获会话(每个RNCamera都会创建自己的AVCaptureSession)。当第二个会话尝试启动时,第一个会话会抢占摄像头资源,所以只有第一个能正常工作。
接下来给你两个可行的解决方案:
方案1:切换到支持多摄像头的库(推荐)
react-native-camera现在已经进入维护状态,很多新特性都不再更新了。更推荐你改用react-native-vision-camera——这个库原生支持多摄像头同时捕获,能轻松实现你要的WhatsApp式画中画效果。
具体步骤如下:
- 先安装依赖:
npm install react-native-vision-camera
- 确保你的
Info.plist里添加了摄像头权限(如果还没加的话):
<key>NSCameraUsageDescription</key> <string>需要访问摄像头来显示视频预览</string> <key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风(如果需要音频的话)</string>
- 替换你的渲染代码:
import React from 'react'; import { View, StyleSheet } from 'react-native'; import { Camera, useCameraDevices } from 'react-native-vision-camera'; export default function CameraPreview() { // 获取前后置摄像头设备 const devices = useCameraDevices(); const backCamera = devices.back; const frontCamera = devices.front; // 等待设备加载完成 if (!backCamera || !frontCamera) { return <View style={styles.container} />; } return ( <View style={styles.container}> {/* 后置摄像头全屏显示 */} <Camera style={styles.backCamera} device={backCamera} isActive={true} // 启动摄像头 /> {/* 前置摄像头悬浮小窗口 */} <Camera style={styles.frontCamera} device={frontCamera} isActive={true} // 启动摄像头 /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'black', }, backCamera: { flex: 1, }, frontCamera: { position: 'absolute', bottom: 24, right: 24, width: 120, height: 160, borderRadius: 12, overflow: 'hidden', borderWidth: 2, borderColor: 'white', }, });
方案2:基于react-native-camera的原生定制(不推荐)
如果你一定要坚持用react-native-camera,那你得自己写iOS原生代码来实现多摄像头捕获——因为官方库并没有暴露AVCaptureMultiCamSession的相关API。大致思路是:
- 在iOS原生端创建一个多摄像头会话,同时添加前后置摄像头的输入源
- 为每个摄像头创建独立的预览层,再把这些预览层传递给React Native端渲染
- 这个方案需要你有iOS原生开发经验,成本比较高,所以更推荐方案1
最后提醒下:确保你是用真机测试的(你已经用了iPhone SE,没问题),iOS模拟器是不支持摄像头功能的。
内容的提问来源于stack exchange,提问作者Sergen
相关产品推荐
相关产品推荐

