我正在开发一个需要使用实时图像处理的项目 Android智能手机的相机(实际上是三星Galaxy S7)。
简而言之,主要要求/条件是:
我尝试使用带有ImageReader
表面的Camera2 Api进行常规捕捉,但是
即使关闭自动控制模式,为捕获请求设置更大的范围,我能得到的最好是37fps(只是捕获,而不是处理)
改变曝光时间,帧持续时间等。
现在,我正在尝试使用Camera2 Api中的CameraConstrainedHighSpeedCaptureSession
类来解决问题。
但是,Android参考资料说它应该用于高速VIDEO RECORDING用例。
此外,根据文档,方法createConstrainedHighSpeedCaptureSession
需要一个表面
必须是视频编码器表面(可以从MediaRecorder
获取)或预览表面(从SurfaceView
获得,SurfaceTexture
)。
我认为这种捕获模式使用一种特殊的表面/缓冲区(可能更快更有效)。
使用预览表面(SurfaceView
,SurfaceTexture
),我想我可能会陷入60fps(显示器的刷新率)。所以,
我正在寻找一种方法来访问BufferQueue
表面下的MediaRecorder
,也许使用NDK / JNI。
我们的想法是在为视频目的编码帧之前,访问从摄像机设备传递到MediaRecorder
的原始帧数据。
拜托,这可能吗?如何实现?还有更好的方法吗?
作为替代方案,我读过一篇关于FileDescriptor
的文章,目的是重定向MediaRecorder
生成的视频帧
到内存中的缓冲区然后尝试在生成这些帧时访问这些帧,但它似乎非常低效
申请可能无法容忍延迟。