如何解决使用 Vulkan 从 Android Camera2 硬件缓冲区采样 - 图像格式问题
我目前正在使用 Android ndk 使用 C++ 开发一个应用程序,我需要创建一个采样器来访问相机输出图像。
我已使用 AIMAGE_FORMAT_YUV_420_888 完成此操作,并使用 VkSamplerYcbcrConversion 访问硬件缓冲区中的图像。我在着色器中进行了 yuv -> rgb 转换,在我的手机上一切正常。
此后我发现这不适用于三星手机,尤其是三星 Galaxy S10/S10+。
原因是当我使用 AIMAGE_FORMAT_YUV_420_888 设置图像阅读器时,使用三星时出现相机错误。在我的 OnePlus 和另一部手机上,我尝试管道完全按预期工作。我创建了一个非常简单的测试设置,甚至尝试在三星 S10 上的 ImageReader 中使用该图像格式打开相机并出现错误,但是当我将 ImageReader 格式更改为 AIMAGE_FORMAT_JPEG 时,错误消失了,相机似乎按预期启动.
AImageReader* SimpleCamera::CreateJpegReader()
{
AImageReader* reader = nullptr;
// media_status_t status = AImageReader_new(640,480,AIMAGE_FORMAT_JPEG,//AIMAGE_FORMAT_RGBA_8888
//media_status_t status = AImageReader_new(640,AIMAGE_FORMAT_RGB_565,4,&reader);
media_status_t status = AImageReader_newWithUsage(640,//AIMAGE_FORMAT_RGBA_8888,//AIMAGE_FORMAT_RGB_565,//AIMAGE_FORMAT_RGB_888,AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_CPU_READ_RARELY,&reader);
if (status != AMEDIA_OK) {
LOGE("Couldn't create new image reader");
return nullptr;
}
AImageReader_ImageListener listener{
.context = nullptr,.onImageAvailable = imageCallback1,};
AImageReader_setImageListener(reader,&listener);
return reader;
}
除 AIMAGE_FORMAT_JPEG 外,不保证支持任何其他格式,但此格式似乎不适用于 VkSamplerYcbcrConversion,因为图像布局不同。
有没有人遇到过这个问题?如果是这样,您是如何解决的?
从高层次来看,目标是:在 C++ 中,从 camera2 api 获取图像并放到 VkImage 上。如果有人知道这样做的替代方法,我也是全神贯注的。
解决方法
尝试将 ImageFormat.PRIVATE 与 USAGE_GPU_SAMPLED_IMAGE 标志一起使用。这曾经特别适用于提到的三星设备。
请务必阅读 Vulkan specification,因为有很多 Android 特定的和 VkSamplerYcbcrConversion
要求。
我还可以推荐查看使用 android camera2 api 和 vulkan 的 this great project。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。