我正在构建一个处理三项任务的相机应用程序(使用camera2 api)。它会预览TextureView
中的当前图片,作为Fragment
的一部分。其次,它将单个图像转发到允许进一步处理的第二个实例(在本机JNI中使用JavaCV或openCV),最后它记录并存储视频流。
我开始使用camera2 API的相机示例,该示例允许通过ImageReader保存图像,并在单个图像可用时扩展处理单个图像的功能。 资料来源:Camera2Basic, ImageReader onAvailable processing
对于录制内容,我已阅读有关如何将相机数据输入MediaCodec
或MediaRecorder
进程的信息。让我困惑的是以下内容:
在没有经常复制数据的情况下,camera2管理这些任务(单个图像处理,视频录制)的内存的最有效方法是什么。
API是否希望开发人员向previewRequestBuilder添加更多目标以及捕获会话的表面,或者是否优先使用单个线程管道来处理图像并将其存储在Bytebuffer
中,以保留所有帧视频?
mRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
// This is the output Surface
Surface surface = new Surface(texture);
Surface mImageSurface = mImageReader.getSurface();
// Add the new target to CaptureRequest.Builder
mRequestBuilder.addTarget(surface); // preview in TextureView
mRequestBuilder.addTarget(mImageSurface); // used for image processing
// TODO: need video recording target or usage of
// one target for image processing and video recording?
// Here, we create a CameraCaptureSession for camera preview.
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageSurface), new CameraCaptureSession.StateCallback(){...});