Expo recordAsync() 不返回响应

问题描述 投票:0回答:3

我能够使用 takePictureAsync() 拍照,它确实给了我一个响应。 但是,我无法收到 recordAsync() 的响应。

这些是我的依赖项:

import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
import { Camera } from 'expo-camera';

这些是权限:

useEffect(() => {
    (async () => {
      const { status } = await Camera.requestPermissionsAsync();
      setHasPermission(status === 'granted');
    })();
  }, []);

这些是功能和状态:

  const [hasPermission, setHasPermission] = useState(null);
  const [type, setType] = useState(Camera.Constants.Type.back);
  const [record, setRecord] = useState(false)
  const [cam, setCam] = useState(null)

  const takeVideo = async () => {
    console.log('take video')
    if(cam){
      setRecord(true)
      let video = await cam.recordAsync({mute:true, maxDuration:5})
      console.log('video', video)  
    }
  }

 const stopRecord = async () => {
    console.log('stop record')
    let endVideo = await cam.stopRecording()
    console.log('end video', endVideo)
    setRecord(false)
  }

这些是渲染图:

<View style={styles.container}>
  <Camera style={styles.camera} type={type} ref={(ref)=>setCam(ref)}>
     <View style={styles.buttonContainer}>
        {record?
          <TouchableOpacity style={styles.button} onPress={() => stopRecord()}>
            <Text style={styles.text}> Stop </Text>
          </TouchableOpacity>:
          <TouchableOpacity
            style={styles.button}
            onPress={() => {takeVideo()}}>
            <Text style={styles.text}> Record </Text>
          </TouchableOpacity>
        }
          
      </View>
    </Camera>
</View>
camera expo
3个回答
5
投票

经过一晚上的尝试,我发现了问题所在。 要在世博会上录制视频,用户需要授予应用程序音频权限。文档中没有说明这一点。(https://docs.expo.io/versions/latest/sdk/camera/#recordasync)

const {status} = await Audio.requestPermissionsAsync();

希望expo能够更新此文档。

我如何发现它需要音频许可? 我使用 try/catch 来捕获错误。

try{
    if(cam){
      setRecord(true)
      let video = await cam.recordAsync({mute:true, maxDuration:5})
      console.log('video', video)
    }
   }catch(err){
      console.log(err)
   }

0
投票

我使用 expo 相机 v: ~14.0.4 解决了此代码的问题

相机是在fuc的开头定义的。

 let camera: Camera

html 组件:

  <Camera
    style={StyleSheet.absoluteFill}
    type={cameraType}
    flashMode={flashMode}
    ref={(ref) => { camera = ref }}
  ></Camera>

和js代码

  await cam.recordAsync({ maxDuration: 10 }).then(async res => {
    console.log(res.uri); // THIS IS THE VIDEO URI
  });

开始录音的按钮是这样定义的。

  <Pressable
    onPressOut={() => onStoppedRecording()}
    onLongPress={() => handleLongCapture(camera)}
  >
     <Text>Record Video</Text>
  </Pressable>

0
投票

记得将CameraView模式设置为“视频”

<CameraView
    ref={cameraRef}
    style={{ flex: 1 }}
    mode={'video'}
>
© www.soinside.com 2019 - 2024. All rights reserved.