我想从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获得相同的结果?
答案 0 :(得分:0)
您正在请求全分辨率RAW帧;不能保证以30fps的速度提供这些内容(因为它们往往很大)。您可以通过StreamConfigurationMap查询来检查其最大帧速率。
如果要匹配旧的API行为,则要设置ImageReader分辨率以匹配预览分辨率,并将格式设置为YUV_420_888。
在高端设备上,您可以使用YUV_420_888将分辨率设置为最高,甚至可以使用RAW输出,但这将是特定于设备的(查找支持BURST_CAPTURE功能的设备)