问题
I've been attempting to get the react-native-camera's video feature to work, but and have tried a vast number of methods but keep getting the same errors. Here is my code:
class MainCamera extends Component {
constructor() {
super();
this.render = this.render.bind(this)
this.state = { cameraType: Camera.constants.Type.back }
}
render() {
return (
<View style={styles.container}>
<Camera
ref='camera'
style={styles.preview}
aspect={Camera.constants.Aspect.fill}
type={this.state.cameraType}
captureMode={Camera.constants.CaptureMode.video}
captureAudio={false}
target={Camera.constants.CaptureTarget.disk}>
<TouchableHighlight
onPressIn={this.onPressIn.bind(this)}
onPressOut={this.stopVideo.bind(this)}>
<Icon name="video-camera" size={40} />
</TouchableHighlight>
</Camera>
</View>
);
}
onPressIn() {
recordVideo = setTimeout(this.takeVideo.bind(this), 100);
}
takeVideo() {
this.refs.camera.capture({
target: Camera.constants.CaptureTarget.disk
})
.then(data => {
console.log(data);
})
.catch(err => console.log(err));
}
stopVideo() {
this.refs.camera.stopCapture({})
.then(data => console.log(data))
.catch(err => console.log(err));
}
}
When I use the '.then' promise on the stopCapture() method, I receive the error "Cannot read property 'then' of undefined", but if I don't add the '.then', then nothing happens and I don't receive any data. Does anybody have any suggestions?
回答1:
takeVideo() {
this.refs.camera.capture({
audio: true,
mode: Camera.constants.CaptureMode.video,
target: Camera.constants.CaptureTarget.disk
})
.then((data) => {
console.log(data);
})
.catch((err) => console.log(err));
}
stopVideo() {
this.refs.camera.stopCapture();
}
The stopCapture()
function is not a promise.
回答2:
syntax error:
then((data) => {
console.log(data);
})
((data)=>{}) should be done instead of (data=>{}).
回答3:
The new component after the unfortunate loss of the old file:
class VideoCamera extends Component {
constructor() {
super()
this.state = {
captureMode: Camera.constants.CaptureMode.video,
captureAudio: false,
captureTarget: Camera.constants.CaptureTarget.cameraRoll,
}
}
render() {
return (
<View style={styles.container}>
<Camera
aspect={Camera.constants.Aspect.fill}
captureAudio={this.state.captureAudio}
captureMode={this.state.captureMode}
captureTarget={this.state.captureTarget}
ref="camera"
style={styles.preview}
>
<TouchableHighlight
onPressIn={this._startRecord.bind(this)}
onPressOut={this._endVideo.bind(this)}
>
<Icon
name={'video-camera'}
size={40}
style={styles.recordButton}
/>
</TouchableHighlight>
</Camera>
</View>
)
}
_startRecord() {
startVideo = setTimeout(this._recordVideo.bind(this), 50)
}
_recordVideo() {
this.refs.camera.capture({})
.then((data) => console.log(data))
.catch((err) => console.log(err))
}
_endVideo() {
this.refs.camera.stopCapture()
}
}
回答4:
Camera is opened, create 2 buttons to start and stop the video below.
<View style={styles.container}>
<RNCamera
ref={ref => {
this.camera = ref;
}}
style={styles.preview}
type={RNCamera.Constants.Type.back}
flashMode={RNCamera.Constants.FlashMode.on}
androidCameraPermissionOptions={{
title: 'Permission to use camera',
message: 'We need your permission to use your camera',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
androidRecordAudioPermissionOptions={{
title: 'Permission to use audio recording',
message: 'We need your permission to use your audio',
buttonPositive: 'Ok',
buttonNegative: 'Cancel',
}}
onGoogleVisionBarcodesDetected={({ barcodes }) => {
console.log(barcodes);
}}
captureAudio={true}
/>
<View style={{ flex: 0, flexDirection: 'row', justifyContent: 'center' }}>
<TouchableOpacity onPress={this.takeVideo.bind(this)} style={styles.capture}>
<Text style={{ fontSize: 14 }}> VIDEO </Text>
</TouchableOpacity>
<TouchableOpacity onPress={this.stoprec.bind(this)} style={styles.capture}>
<Text style={{ fontSize: 14 }}> STOP </Text>
</TouchableOpacity>
</View>
Also create two methods to record video and stop the recording as below. and below methods are called in above buttons.
takeVideo = async () => {
if (this.camera) {
try {
const options = {
quality: 0.5,
videoBitrate: 8000000,
maxDuration: 30
};
const promise = this.camera.recordAsync(options);
if (promise) {
this.setState({ recording: true });
const data = await promise;
this.setState({ recording: false });
}
} catch (error) {
console.log(error);
}
}
}
//stop the recording by below method
stoprec = async () => {
await this.camera.stopRecording();
}
And finally, if you want file path and all you will get as data.uri
Thank you. Hope it gives the clear picture
来源:https://stackoverflow.com/questions/37960958/how-do-i-access-the-react-native-cameras-video-capabilities