Camera2设置预览(查看)并获取预览回调

时间:2018-07-29 11:28:33

标签: android android-camera2

我想从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获得相同的结果?

1 个答案:

答案 0 :(得分:0)

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

如果要匹配旧的API行为,则要设置ImageReader分辨率以匹配预览分辨率,并将格式设置为YUV_420_888。
在高端设备上,您可以使用YUV_420_888将分辨率设置为最高,甚至可以使用RAW输出,但这将是特定于设备的(查找支持BURST_CAPTURE功能的设备)