android - 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 获得相同的结果呢?
解决方案
您正在请求全分辨率 RAW 帧;这些不能保证以 30fps 的速度可用(因为它们往往很大)。您可以通过StreamConfigurationMap查询检查它们的最大帧速率。
如果你想匹配旧的 API 行为,你想设置 ImageReader 的分辨率来匹配你的预览分辨率,格式为 YUV_420_888。
在高端设备上,您可以使用 YUV_420_888 将分辨率设置为最大值,甚至使用 RAW 输出,但这将取决于设备(寻找支持BURST_CAPTURE功能的设备)
推荐阅读
- python - XGBoost 在终端和笔记本上运行两次
- amazon-web-services - 在 AWS 中使用 Codepipeline 时遇到的错误
- javascript - 在jQuery中加载页面后点击正文上的事件?
- html - 如何强制响应式 iframe 目标尊重 iframe 的视口并做出响应,就好像它被直接访问一样?
- python-3.x - 提取在同一行中同时具有时间戳和位置的数据帧
- python - 如何选择标签编码的分类变量来创建傻瓜?
- windows - 无法从命令提示符打开 Jupyter 笔记本
- html - 如何从
- python - AttributeError:“PosixPath”对象没有属性“路径”
- pdf - 是否可以使用 Quicklook 在 SwiftUI 中打开 PDF?