camera - 在android中使用Camera2进行实时处理应该采用什么图像格式?
问题描述
我正在开发一个处理 Camera2 预览帧并在纹理上显示处理帧的 android 应用程序。起初,我用 camera1 api 进行了测试,它可以很好地用于实时图像处理。
private class CameraPreviewCallback implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
processingRunnable.setNextFrame(data, camera);
}
}
然后,我更改了使用 camera2 api 的代码。为了获取预览帧,我将 ImageFormat 设置为 YUV_420_888
mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 3);
mImageReaderPreview.setOnImageAvailableListener(mOnPreviewAvailableListener, mBackgroundHandler);
private final ImageReader.OnImageAvailableListener mOnPreviewAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image mImage = reader.acquireLatestImage();
if(mImage == null) {
return;
}
processingRunnable.setNextFrame(convertYUV420888ToNV21(mImage));
mImage.close();
}
};
但是,它的工作速度比 camera1 慢。可能是因为从 YUV_420_888 到 NV21 的额外转换。由于 Camera1 可以直接从 Camera1 提供 NV21 帧。
解决方案
转换可能很昂贵,具体取决于您如何实现它以及给定设备上 YUV_420_888 的布局是什么。
当然,如果它是用纯 Java 编写的,可能会很慢。
也就是说,如果您使用的设备处于 LEGACY 硬件级别,则 camera2 必须在传统模式下运行,接收 YUV 信息可能会很慢。对于这些设备,对于您的用例来说,停留在 API1 上可能更可取。
推荐阅读
- c# - 如何在 C# 接口中实现泛型?
- php - 如何使 Bootstrap Tab 动态 PHP?
- java - 如何在 GridBagLayout 的特定坐标中添加和删除组件?
- c++ - 是否可以使用 Xcode 调试运行 C 库的 lua 脚本?
- java - 从 https://start.spring.io/ 下载后 pom.xml 显示错误
- c# - 当托管在 IIS asp.net 上时,Oledb 连接会引发 Visual Studio JIT 编译器弹出窗口
- python - 如何对抗面向 relu 的 CNN 产生的大量数字
- python - 如何将 python 编译为 dll/so 库?
- python - Jinja2 模板中的额外换行符
- javascript - 未捕获的 ReferenceError:$result 未定义