You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:33:14