如何访问 react-native-camera 的视频功能?

Posted

技术标签:

【中文标题】如何访问 react-native-camera 的视频功能?【英文标题】:How do I access the react-native-camera's video capabilities? 【发布时间】:2016-06-22 07:12:55 【问题描述】:

我一直在尝试让 react-native-camera 的视频功能正常工作,但是我尝试了很多方法,但总是遇到同样的错误。这是我的代码:

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));
  

当我在 stopCapture() 方法上使用 '.then' 承诺时,我收到错误“无法读取未定义的属性 'then'”,但如果我不添加 '.then',则不会发生任何事情而且我没有收到任何数据。有人有什么建议吗?

【问题讨论】:

***.com/questions/48280005/… 【参考方案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();

stopCapture() 函数不是承诺。

【讨论】:

好的,它现在需要视频。但我知道的唯一方法是将目标更改为“Camera.constants.CaptureTarget.cameraRoll”,然后检查我的相机胶卷以查看那里的视频。我的问题是它没有 console.log 任何数据,因为我想在我的应用程序中使用该视频数据做其他事情,而不仅仅是将视频文件保存到我的手机。 没关系,由于某种原因,它们只显示在 Xcode 的控制台中,而不显示在 Google Chrome 调试工具中。尽管如此,我正在获取数据。谢谢。 我很遗憾丢失了这个文件,我又从头开始重做这个项目。我的一切都与我记忆中的完全一样,但数据仍然不会打印出来。如果您仍然能够提供帮助,那就太好了。如果您可以看一下,我将在下面发布新组件。此评论框空间不足,无法发表。【参考方案2】:

语法错误:

then((data) => 
    console.log(data);
  )

((data)=>) should be done instead of (data=>).

【讨论】:

stopVideo() this.refs.camera.stopCapture() .then((data) =&gt; console.log(data) ) .catch((err) =&gt; console.log(err)); 这是更新后的函数,我仍然得到同样的错误 cannot read 'then' of undefined 您是否更新了 takeVideo() 方法中的代码?如果仍然有问题,请发布您的控制台错误屏幕截图或移动屏幕截图 我确实更新了 takeVideo() 方法。这是我继续得到 [1] 的错误图像:i.stack.imgur.com/HIaU9.png【参考方案3】:

旧文件不幸丢失后的新组件:

 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】:

相机打开,创建2个按钮来开始和停止下面的视频。

                <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>

还创建两种方法来录制视频和停止录制,如下所示。和下面的方法在上面的按钮中被调用。

 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();
    

最后,如果你想要文件路径和所有你会得到的 data.uri

谢谢。希望能给出清晰的画面

【讨论】:

以上是关于如何访问 react-native-camera 的视频功能?的主要内容,如果未能解决你的问题,请参考以下文章

在首先按下不允许后如何授予对 react-native-camera 的访问权限?

如何使用 react-native-camera 捕获图片

如何将捕获的图像与 react-native-camera 一起使用

`react-native-camera` 返回 data.uri 但无法访问图像(没有这样的文件或目录)

如何使用 React-Native-Camera 捕获获取元数据?

如何使用 react-native-camera 录制视频