【发布时间】:2016-03-07 10:41:12
【问题描述】:
更新:这看起来与此有关:Image data from Android camera2 API flipped & squished on Galaxy S5 - 我认为这是一个错误,因为 Nexus 5/6 可以正常工作,并且需要获得完整的传感器尺寸和然后手动裁剪以达到所需的纵横比,最好不要使用“支持”的输出尺寸!
问题:
- 使用 Camera2 API 获取相机的特征,并提取适合 MediaCodec.class 的输出大小
- 使用合适的摄像机输出尺寸之一创建 MediaCodec 输入表面。将输出提供给一些 MediaMuxer 或其他任何东西,以查看输出。
- 使用编解码器创建的表面作为目标启动相机捕获请求。
-
编解码器输出的大小正确。但结果因设备而异:
- Nexus 5/6:在 Android 5/6 上一切正常。
- Android 5.1 的三星平板:某些分辨率下,图像明显拉伸,说明摄像头输出分辨率与表面尺寸不匹配。开始旋转相机时变得非常明显 - 图像变得越来越倾斜,因为它没有与 X/Y 轴对齐。对于其他一些分辨率,输出正常。这里没有与大小或纵横比相关的模式。
没问题,有人会说。也许表面不是完全按照指定的宽度和高度创建的,或者其他什么(即使输出大小是专门为 MediaCodec.class 目标提取的)。
因此,我创建了一个 OpenGL 上下文,为其生成了一个纹理,一个 SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用该纹理创建了一个 Surface。我不会深入讨论将其绘制到 TextureView 或返回到 MediaCodec 的 EGL 表面的血腥细节。结果是相同的 - Camera2 捕获请求仅针对某些分辨率输出失真图像。 深入挖掘:在 updateTexImage 之后立即在 SurfaceTexture 上调用 getTransformMatrix - 正如预期的那样,矩阵始终是单位矩阵。
所以,这里真正的问题是相机没有以提供的目标表面大小进行捕捉。因此,解决方案是获取相机正在捕获的 实际 大小,其余的是纯 GL 矩阵变换以正确绘制。但是 - 我如何得到它?
注意:使用旧的 Camera API,具有完全相同的“预览尺寸”和 相同 表面作为目标(MediaCodec 或自定义) - 一切都很好!但是我不能使用旧的相机 API,因为它已被弃用,而且似乎最大捕获大小为 1080p,而 Camera2 API 超出了这个范围,我需要支持 4k 录制。
【问题讨论】:
-
你能找到解决办法吗?
-
没有。我学会了忍受它作为一个 BUG 并继续前进。谷歌总是会说这是三星的问题,只要人们盲目地购买他们最新的旗舰产品,三星就不会关心模糊的平台错误或他们的 Camera2 API 实现。
-
我最终将 Marshmellow 下的三星设备列入白名单以使用 camera1 代替,三星似乎直到 Marshmellow 才费心更新其相机以与 camera2 一起使用
-
@AdrianCrețu 嘿,我能知道你是如何通过 openGl 创建camera2 perview 的吗?我需要帮助
-
@RautDarpan - 我已经生成了一个 OpenGL 纹理并使用它来创建输入到相机捕获请求中的 SurfaceTexture/Surface。其余的是通常的 OpenGL 操作。当然,如果您询问如何进一步操作,细节可能会变得复杂,但这是核心。
标签: android android-camera android-mediacodec android-camera2