如何在Android中使用受约束的高速捕获会话进行实时图像处理?

时间:2016-09-29 18:45:52

标签: android-ndk real-time surfaceview mediarecorder android-camera2

我正在开发一个需要使用实时图像处理的项目 Android智能手机的相机(实际上是三星Galaxy S7)。

简而言之,主要要求/条件是:

  • 我需要以高帧率实时捕捉和处理图像 (理想的是120fps或240fps,但60fps将是一个良好的开端);
  • 无需预览显示的图像;
  • 我只需要灰度图像(使用nv21格式,这是图像数据的第一部分)。 因此,为了提高效率,我宁愿不将图像从原生格式转换为jpg,然后解码并计算灰度数据;
  • 我不需要高分辨率图像(640x480就可以了)并且帧处理本身相对简单并且可以非常快速地完成 (我只需要扫描灰度数据并提取一些基本信息);

我尝试使用带有ImageReader表面的Camera2 Api进行常规捕捉,但是 即使关闭自动控制模式,为捕获请求设置更大的范围,我能得到的最好是37fps(只是捕获,而不是处理) 改变曝光时间,帧持续时间等。

现在,我正在尝试使用Camera2 Api中的CameraConstrainedHighSpeedCaptureSession类来解决问题。 但是,Android参考资料说它应该用于高速VIDEO RECORDING用例。 此外,根据文档,方法createConstrainedHighSpeedCaptureSession需要一个表面 必须是视频编码器表面(可以从MediaRecorder获取)或预览表面(从SurfaceView获得,SurfaceTexture)。 我认为这种捕获模式使用一种特殊的表面/缓冲区(可能更快更有效)。

使用预览表面(SurfaceViewSurfaceTexture),我想我可能会陷入60fps(显示器的刷新率)。所以, 我正在寻找一种方法来访问BufferQueue表面下的MediaRecorder,也许使用NDK / JNI。 我们的想法是在为视频目的编码帧之前,访问从摄像机设备传递到MediaRecorder的原始帧数据。

拜托,这可能吗?如何实现?还有更好的方法吗?

作为替代方案,我读过一篇关于FileDescriptor的文章,目的是重定向MediaRecorder生成的视频帧 到内存中的缓冲区然后尝试在生成这些帧时访问这些帧,但它似乎非常低效 申请可能无法容忍延迟。

0 个答案:

没有答案