在android上用摄像头处理和写入OpenCV视频的最快方法?

在android上用摄像头处理和写入OpenCV视频的最快方法?,android,opencv,android-camera,android-mediacodec,Android,Opencv,Android Camera,Android Mediacodec,我见过关于类似问题的问题,但并没有得到回答。 我认为有两种可能性: 要从摄像机录制视频,请使用标准的android工具MediaRecorder,同时在previewCallback中使用OpenCV处理字节[]数组 使用MediaCodec录制视频,就像在Gragika项目中一样。录制时,使用纹理中的glReadPixels并将其传送到OpenCV Mat进行处理 还有什么更好或可能存在的其他方法吗?我已经找到了 对于您提到的第一种方式: 准备MediaRecorder之前,请锁定相机 在me

我见过关于类似问题的问题,但并没有得到回答。 我认为有两种可能性:

  • 要从摄像机录制视频,请使用标准的android工具MediaRecorder,同时在previewCallback中使用OpenCV处理字节[]数组

  • 使用MediaCodec录制视频,就像在Gragika项目中一样。录制时,使用纹理中的glReadPixels并将其传送到OpenCV Mat进行处理

  • 还有什么更好或可能存在的其他方法吗?

    我已经找到了

    对于您提到的第一种方式:

  • 准备MediaRecorder之前,请锁定相机

  • 在mediaRecorder的
    start()
    方法之后立即调用
    reconnect()
    重新锁定摄像头

  • 但是,由于API级别14,在调用
    start()
    后,摄像机可以自动重新锁定,因此实际上您不需要
    重新连接()

  • 设置预览回调。如果要获得更高的帧速率,请使用
    setPreviewCallbackWithBuffer()
    并设置多个回调缓冲区
  • 但从我的实验来看,预览回调的帧和MediaRecorder记录的帧是异步的。因此,如果需要,很难保证帧同步

    第二种方法是:完全控制帧

    感谢fadden的项目,我在进行图像处理时成功地录制了视频,使用MediaCodec对来自预览回调的视频帧进行编码,并通过JNI将预览数据传递给本机层,以便使用OpenCV进行图像处理


    需要注意的是,为了提高实时效率,您必须在另一个线程中进行处理,并确保与编码线程同步。

    如果您可以将帧同时发送到ImageReader和MediaCodec,则可以在不必要复制字节的情况下进行软件访问和硬件编码。旧的CameraAPI不可能,但Camera2也可能。关于第一种方式。这是可能的,但需要在录制后再次开始侦听(在record.start()之后再次调用setPreviewCallback()。这是我手机上的工作。据我所知,您使用mediacodec从previewTexture中编写,并使用previewCallback为OpenCV获取字节[]?关于“通过JNI将预览数据传递到本机层”,你能说得更多吗?是的,你说得对。我试过了,它确实奏效了。但是,如果希望当前使用MediaRecorder录制的帧是来自预览回调的帧,则似乎很难保证同步,因为它们是异步的。我使用MediaCodec对来自预览回调的字节[]数据进行编码,而不使用previewTexture。在另一个线程中,我使用JNI将预览数据发送到本机层。这是否比使用bigflake CameraToMpegTest中的previewTexture更快?我尝试使用它,同时预览OpenCV的回调。