Android OpenGL camera2 纹理分辨率

Posted

技术标签:

【中文标题】Android OpenGL camera2 纹理分辨率【英文标题】:Android OpenGL camera2 texture resolution 【发布时间】:2018-08-05 21:59:25 【问题描述】:

简介

我使用CaptureRequest.Builder 并提供两个表面作为目标:SurfaceTexture 用于绘制 GL,ImageReader (getSurface()) 用于处理框架。

我通过设置surfaceTexture.setDefaultBufferSize 和创建ImageReader.newInstance 来设置所需的分辨率640x480。

问题

似乎SurfaceTexture OpenGL 纹理正在获取与 640x480 (4:3) 不同纵横比的图像,更像是 2560x1440 (16:9)(SurfaceTexture 占据全屏,请参阅 IMG 3 )。需要注意的是,两款手机的分辨率长宽比相同16:9。 (纹理从侧面偏移是故意留下的)。

您可以在下面看到 IMG 1 显示在监视器屏幕上,IMG 2IMG 3 是当前活动视图的手机屏幕截图正在显示相机预览。

问题

如何正确强制 SurfaceTexture 或 GLSurfaceView.Renderer 从相机获取特定(在本例中为 4:3)纵横比纹理图像以获得任意大小的视图?

相关

需要注意的是,an app 解决了问题,但 they change the view size 对应于所需的纵横比。

另见

GitHub repo。 Relevant source code。 Related post Related post

IMG 1 - 显示的源图像:

IMG 2 - 良好的纵横比(Google Nexus 5 - android 6.0.1):

IMG 3 - 纹理纵横比不佳 (LG-D855 - Android 5.0)

【问题讨论】:

【参考方案1】:

通过将 LG 手机更新至 Android 6.0,“修复”了该问题。

【讨论】:

如果你将你的应用发布给全世界,这不是一个解决方案。因此,如果您支持 Android 5-7,请不要使用 Camera2 API:github.com/googlesamples/android-Camera2Basic/issues/123

以上是关于Android OpenGL camera2 纹理分辨率的主要内容,如果未能解决你的问题,请参考以下文章

Android音视频(六) 使用OpenGL ES 3.0预览Camera

Android 上的 OpenGL - 将位图转换为纹理,并保存纹理

Android OpenGL ES----理解纹理与纹理过滤

Android OpenGL 纹理/对象检测

初学Android OpenGL ES之使用纹理 八十三

在openGl android(Wear)中绘制基于图像的纹理