首页 > 解决方案 > Camera2 设置预览(View)并获取预览回调

问题描述

我想从 Camera2 中获取预览以及处理帧的 byte[] 回调

mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
        ImageFormat.RAW_SENSOR,1);
mImageReader.setOnImageAvailableListener(
        mOnImageAvailableListener, mBackgroundHandler);

.

SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;

// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);

// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder
        = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mPreviewRequestBuilder.addTarget(surface);
// also for preview callbacks
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

但是当我添加第二个目标(ImageReader 的表面)时,fps 变得非常糟糕 10-15 而不是 30

使用 Legacy Camera API 它工作正常

byte[] 帧回调

mCamera.setPreviewCallback(this);

@Override
public void onPreviewFrame(byte[] data, Camera camera) {

}

预习

mCamera.setPreviewDisplay(mSurfaceView.getSurfaceHolder());

它不会影响旧版 Camera API 的 FPS 质量

那么如何使用 Camera2 获得相同的结果呢?

标签: androidandroid-camera2

解决方案


您正在请求全分辨率 RAW 帧;这些不能保证以 30fps 的速度可用(因为它们往往很大)。您可以通过StreamConfigurationMap查询检查它们的最大帧速率。

如果你想匹配旧的 API 行为,你想设置 ImageReader 的分辨率来匹配你的预览分辨率,格式为 YUV_420_888。
在高端设备上,您可以使用 YUV_420_888 将分辨率设置为最大值,甚至使用 RAW 输出,但这将取决于设备(寻找支持BURST_CAPTURE功能的设备)


推荐阅读