更新:看起来与此相关:Image data from Android camera2 API flipped & squished on Galaxy S5 - 我认为这是一个错误,因为Nexus 5/6可以正常工作,需要获取完整的传感器大小,然后手动裁剪以达到所需的宽高比,使用“支持的”输出尺寸也没有意义!
问题:
1. 使用Camera2 API获取相机特性,并提取适合MediaCodec.class的输出尺寸。 2. 使用其中一个适合相机输出尺寸的MediaCodec输入表面创建。将输出馈送到某些MediaMuxer或其他东西,以查看输出。 3. 使用编解码器创建的表面作为目标启动相机捕获请求。 4. 编解码器输出具有正确的大小。但结果因设备而异: Nexus 5/6:在Android 5/6上一切正常。 带有Android 5.1的三星平板电脑:对于某些分辨率,图像明显被拉伸,表明相机输出分辨率与表面大小不匹配。当开始旋转相机时变得非常明显-图像变得越来越倾斜,因为它与X/Y轴不对齐。对于其他一些分辨率,输出是正常的。这里与大小或宽高比没有相关模式。
所以,可以说没有问题。也许表面不是精确地创建在指定的宽度和高度上,或者其他什么(即使输出尺寸是专门为MediaCodec.class目标提取的)。
因此,我创建了一个OpenGL上下文,生成了一个纹理,一个SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用纹理创建了一个Surface。我不会详细介绍将其绘制到TextureView或返回到MediaCodec的EGL表面的细节。结果是相同的- Camera2捕获请求仅针对某些分辨率输出扭曲图像。 深入挖掘:在updateTexImage后立即调用SurfaceTexture上的getTransformMatrix-矩阵始终是恒等矩阵,如预期的那样。
因此,真正的问题在于相机并未以提供的目标表面大小进行捕获。解决方案将因此是获取相机正在捕获的实际大小,其余部分是纯GL矩阵变换以正确绘制。但是-我该怎么做?
注意:使用旧的相机API,具有完全相同的“预览大小”和相同的表面作为目标(无论是MediaCodec的还是自定义的)-一切都很好!但是我不能使用旧的相机API,因为它已被弃用,并且似乎具有最大捕获大小为1080p,而Camera2 API超出了这一范围,我需要支持4k录制。
问题:
1. 使用Camera2 API获取相机特性,并提取适合MediaCodec.class的输出尺寸。 2. 使用其中一个适合相机输出尺寸的MediaCodec输入表面创建。将输出馈送到某些MediaMuxer或其他东西,以查看输出。 3. 使用编解码器创建的表面作为目标启动相机捕获请求。 4. 编解码器输出具有正确的大小。但结果因设备而异: Nexus 5/6:在Android 5/6上一切正常。 带有Android 5.1的三星平板电脑:对于某些分辨率,图像明显被拉伸,表明相机输出分辨率与表面大小不匹配。当开始旋转相机时变得非常明显-图像变得越来越倾斜,因为它与X/Y轴不对齐。对于其他一些分辨率,输出是正常的。这里与大小或宽高比没有相关模式。
所以,可以说没有问题。也许表面不是精确地创建在指定的宽度和高度上,或者其他什么(即使输出尺寸是专门为MediaCodec.class目标提取的)。
因此,我创建了一个OpenGL上下文,生成了一个纹理,一个SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用纹理创建了一个Surface。我不会详细介绍将其绘制到TextureView或返回到MediaCodec的EGL表面的细节。结果是相同的- Camera2捕获请求仅针对某些分辨率输出扭曲图像。 深入挖掘:在updateTexImage后立即调用SurfaceTexture上的getTransformMatrix-矩阵始终是恒等矩阵,如预期的那样。
因此,真正的问题在于相机并未以提供的目标表面大小进行捕获。解决方案将因此是获取相机正在捕获的实际大小,其余部分是纯GL矩阵变换以正确绘制。但是-我该怎么做?
注意:使用旧的相机API,具有完全相同的“预览大小”和相同的表面作为目标(无论是MediaCodec的还是自定义的)-一切都很好!但是我不能使用旧的相机API,因为它已被弃用,并且似乎具有最大捕获大小为1080p,而Camera2 API超出了这一范围,我需要支持4k录制。