React Native Vision Camera启动录制报capture/unknown错误求助
React Native CLI 视频录制报错
prepare failed:-22 排查方案 问题背景
刚接触React Native CLI开发,开发视频录制组件时,安卓设备启动录制立即报错,错误信息如下:
"code": "capture/unknown", "message": "An unknown error occurred while trying to start a video recording! prepare failed:-22", "userInfo": null
已完成排查:确认相机、麦克风权限已授予,相机预览正常,依赖安装和相机初始化流程无问题,但报错仍存在。
相关代码
逻辑部分
const cameraRef = useRef<Camera>(null); const [videoPath, setVideoPath] = useState<string | undefined>(undefined); const [recordingStatus, setRecordingStatus] = useState<boolean>(false); const devices = useCameraDevices(); const device = devices[0]; const checkPermission = async () => { const newCameraPermission = await Camera.requestCameraPermission(); const newMicrophonePermission = await Camera.requestMicrophonePermission(); if (newCameraPermission == null) { ToastAndroid.show('Camera is not ready', ToastAndroid.LONG); } if (newMicrophonePermission == null) { ToastAndroid.show('Microphone is not ready', ToastAndroid.LONG); } }; useEffect(() => { checkPermission(); }, []); if (device == null) { return <ActivityIndicator />; } const startRecording = async () => { if(cameraRef.current){ try { setRecordingStatus(true); await cameraRef.current?.startRecording({ flash: 'off', onRecordingFinished: video => { setVideoPath(video.path); }, onRecordingError: error => console.error(error), }); } catch (e) { console.log('error on recording video: ', e); } } }; const stopRecording = async () => { setRecordingStatus(false); await cameraRef.current?.stopRecording(); };
组件渲染部分
<View style={styles.container}> <Camera ref={cameraRef} style={StyleSheet.absoluteFill} device={device} isActive={true} video={true} /> <View style={styles.buttonContainer}> {recordingStatus ? ( <TouchableOpacity style={styles.recordingButton} onPress={stopRecording} /> ) : ( <TouchableOpacity style={styles.button} onPress={startRecording} /> )} </View> </View>
可能的原因及解决方法
录制参数缺失:部分安卓设备要求明确指定视频输出路径和编码格式,默认配置可能不兼容。
解决:添加outputPath和编码参数,示例:import { DocumentDirectoryPath } from 'react-native-fs'; // ... const startRecording = async () => { if(cameraRef.current){ try { setRecordingStatus(true); const outputPath = `${DocumentDirectoryPath}/recording_${Date.now()}.mp4`; await cameraRef.current.startRecording({ flash: 'off', outputPath, videoCodec: 'h264', // 适配多数设备的编码格式 onRecordingFinished: video => { setVideoPath(video.path); }, onRecordingError: error => console.error(error), }); } catch (e) { console.log('error on recording video: ', e); setRecordingStatus(false); // 出错后重置录制状态 } } };设备选择逻辑问题:
devices[0]可能选中前置相机,部分前置相机硬件不支持视频录制。
解决:优先选择后置相机:const device = devices.back ?? devices.front;权限检查逻辑错误:当前判断权限的条件
newCameraPermission == null不严谨,无法正确识别权限是否已授予。
解决:修改权限判断逻辑,同时补充存储权限请求(安卓设备录制视频需要写入存储权限):import { PermissionsAndroid, ToastAndroid } from 'react-native'; const checkPermission = async () => { const cameraPerm = await Camera.requestCameraPermission(); const micPerm = await Camera.requestMicrophonePermission(); // 安卓13及以下需要存储权限,13+可使用READ_MEDIA_VIDEO const storagePerm = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE ); if (cameraPerm !== 'granted') { ToastAndroid.show('相机权限未授予', ToastAndroid.LONG); } if (micPerm !== 'granted') { ToastAndroid.show('麦克风权限未授予', ToastAndroid.LONG); } if (storagePerm !== PermissionsAndroid.RESULTS.GRANTED) { ToastAndroid.show('存储权限未授予', ToastAndroid.LONG); } };相机模式未明确配置:仅设置
video={true}可能不足以让相机进入视频录制模式,需补充视频质量参数。
解决:在Camera组件中添加videoQuality属性:<Camera ref={cameraRef} style={StyleSheet.absoluteFill} device={device} isActive={true} video={true} videoQuality="720p" // 指定适配的视频质量 />
内容的提问来源于stack exchange,提问作者cris200
相关产品推荐
相关产品推荐

