Android Camera2捕捉图像歪斜
更新 :这看起来像它是这样的:来自Android camera2 API的图像数据在Galaxy S5上翻转和挤压 - 我认为这是一个错误,因为Nexus 5/6工作正常,并且没有必要获得完整的传感器尺寸,然后手动裁剪以达到所需的长宽比,不妨使用“支持”的输出尺寸!
问题:
编解码器输出具有正确的大小。 但结果因设备而异:
没问题,人们会说。 也许曲面不是完全按照指定的宽度和高度创建的,或者其他什么(即使输出尺寸是专门为MediaCodec.class目标提取的)。
所以,我创建了一个OpenGL上下文,为它生成了纹理,SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用纹理创建了Surface。 我不会深入描绘TextureView或MediaCodec的EGL表面。 结果是相同的 - Camera2捕捉请求仅输出一些失真的图像,以用于某些分辨率。 深入挖掘:在updateTexImage之后立即在SurfaceTexture上调用getTransformMatrix - 如预期的那样,矩阵始终是单位矩阵。
所以,这里真正的问题是相机没有捕获到提供的目标表面的大小。 因此解决方案将获得相机捕获的实际大小,其余部分则是纯GL矩阵转换以正确绘制。 但是 - 我怎么得到这个?
注意:使用旧版Camera API,具有与目标完全相同的“预览大小”和相同的表面(MediaCodec或定制的) - ALL IS FINE! 但我不能使用旧的相机API,因为它已被弃用,并且似乎最大捕获大小为1080p,而Camera2 API超出了这个范围,而且我需要支持4k记录。
所以是的,这是三星设备上的一个bug。
一般情况下,这种情况发生在你要求输出有多种不同的宽高比时,并且设备特定的摄像机代码在裁剪和缩放所有这些比例代码时正确跳过。 您可以通过确保所有请求的尺寸具有相同的宽高比来避免此问题。
这个解决方案实际上可能是你要求的 - 但是它的缩放比例不正确(你可以用一个ImageReader来测试这个问题的大小,你可以在其中获得一个明确的缓冲区)。
我们正在为Android兼容性测试添加额外的测试,以确保这些类型的延伸输出不会继续发生。
我遇到类似的问题,型号SM-A7009
,api level 21,传统camera2设备。
预览被拉伸, surfaceTexture.setDefaultBufferSize
不起作用,当预览开始时,框架将覆盖这些值。
StreamConfigurationMap.getOutputSizes(SurfaceTexture.class)
报告的预览大小并不全部受支持。
只有三个支持。
$ adb shell dumpsys media.camera |grep preview-size
preferred-preview-size-for-video: 1920x1080
preview-size: 1440x1080
preview-size-values: 1920x1080,1440x1080,1280x720,1056x864,960x720,880x720,800x480,720x480,640x480,528x432,352x288,320x240,176x144
该系统转储信息列表许多预览尺寸,检查所有的人后,我发现只有1440x1080
, 640x480
, 320x240
的支持。
支持的预览尺寸都有1.33333
比例。 它们具有从CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE
报告的相同比率。
所以我认为这是一些在API 21中使用传统camera2 api的三星设备的bug。
解决方案是使用不推荐的相机API来制作这些设备。
希望这对任何人到达这里都有帮助。
链接地址: http://www.djcxy.com/p/92541.html