我能够使用 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>
经过一晚上的尝试,我发现了问题所在。 要在世博会上录制视频,用户需要授予应用程序音频权限。文档中没有说明这一点。(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)
}
我使用 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>
记得将CameraView模式设置为“视频”
<CameraView
ref={cameraRef}
style={{ flex: 1 }}
mode={'video'}
>