Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Camera2捕获图像倾斜 更新< /强>:这看起来与此有关:-我认为这是一个错误,因为Nexus 5/6工作正常,没有必要获得完整的传感器大小,然后手动裁剪以达到期望的纵横比,也可能不使用“支持”的输出大小!p>_Android_Android Camera_Android Mediacodec_Android Camera2 - Fatal编程技术网

Android Camera2捕获图像倾斜 更新< /强>:这看起来与此有关:-我认为这是一个错误,因为Nexus 5/6工作正常,没有必要获得完整的传感器大小,然后手动裁剪以达到期望的纵横比,也可能不使用“支持”的输出大小!p>

Android Camera2捕获图像倾斜 更新< /强>:这看起来与此有关:-我认为这是一个错误,因为Nexus 5/6工作正常,没有必要获得完整的传感器大小,然后手动裁剪以达到期望的纵横比,也可能不使用“支持”的输出大小!p>,android,android-camera,android-mediacodec,android-camera2,Android,Android Camera,Android Mediacodec,Android Camera2,问题: 使用Camera2 API获取相机的特征,并提取适合MediaCodec.class的输出大小 使用合适的相机输出尺寸之一创建MediaCodec输入表面。将输出馈送到某个MediaMuxer或任何东西,以查看输出 使用编解码器创建的曲面作为目标启动相机捕获请求 编解码器输出的大小正确。但结果因设备而异: Nexus5/6:安卓5/6上一切正常 三星安卓5.1平板电脑:对于某些分辨率,图像明显拉伸,表明相机输出分辨率与表面尺寸不匹配。开始旋转相机时变得非常明显-图像变得越来越倾斜,因为

问题:

  • 使用Camera2 API获取相机的特征,并提取适合MediaCodec.class的输出大小
  • 使用合适的相机输出尺寸之一创建MediaCodec输入表面。将输出馈送到某个MediaMuxer或任何东西,以查看输出
  • 使用编解码器创建的曲面作为目标启动相机捕获请求
  • 编解码器输出的大小正确。但结果因设备而异:

    • Nexus5/6:安卓5/6上一切正常
    • 三星安卓5.1平板电脑:对于某些分辨率,图像明显拉伸,表明相机输出分辨率与表面尺寸不匹配。开始旋转相机时变得非常明显-图像变得越来越倾斜,因为它与X/Y轴不对齐。对于某些其他分辨率,输出正常。这里没有与尺寸或纵横比相关的图案
  • 没问题,有人会说。可能曲面的创建不完全符合指定的宽度和高度,或者其他要求(即使输出大小是专门为MediaCodec.class目标提取的)

    因此,我创建了一个OpenGL上下文,为它生成了一个纹理,一个SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用该纹理创建了一个曲面。我不会深入到绘制到TextureView或回到MediaCodec的EGL表面的血淋淋的细节。结果是相同的-Camera2捕获请求仅在某些分辨率下输出失真图像。 深入挖掘:在UpdateMaximage之后立即在SurfacetTexture上调用getTransformMatrix——正如预期的那样,矩阵始终是标识矩阵

    因此,这里真正的问题是,相机没有以提供的目标表面的大小进行拍摄。因此,解决方案是获得相机正在捕获的实际大小,其余的是纯GL矩阵变换以正确绘制。但是-我怎么才能得到呢


    注意:使用旧的Camera API,使用与目标完全相同的“预览大小”和相同的表面(MediaCodec或自定义),一切都很好!但是我不能使用旧的camera API,因为它已经被弃用了,而且看起来最大捕获大小为1080p,而Camera2 API超出了这个范围,我需要支持4k录制。

    是的,这是三星设备上的一个bug

    通常,当您在输出上要求多个不同的纵横比时,就会发生这种情况,并且特定于设备的相机代码会在正确裁剪和缩放所有纵横比时自动跳转。您可以通过确保所有请求的大小具有相同的纵横比来避免这种情况

    分辨率可能实际上是您要求的-但它的缩放不正确(您可以使用尺寸有问题的ImageReader进行测试,在这里您可以使用一个显式缓冲区。)


    我们在Android合规性测试中添加了额外的测试,以确保此类拉伸输出不会继续发生。

    我遇到了类似的问题,型号为SM-A7009,api级别为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
    
    只支持其中三个

    $ 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

    $ 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
    
    支持的预览大小都具有
    1.33333
    比率。它们具有从
    摄像机特性报告的相同比率。传感器信息活动阵列大小

    所以我认为这是一些三星设备在api 21中使用传统camera2 api的一个缺陷

    解决方案是使用不推荐的摄像头API制作这些设备


    希望它能对任何到达这里的人有所帮助。

    你能找到修复方法吗?没有。我学会了把它当作一个BUG来对待,然后继续前进。谷歌总是说这是三星的问题,只要人们盲目地购买他们最新的旗舰产品,三星就不在乎那些晦涩难懂的平台错误或他们的Camera2 API实现。我最终将三星设备列入Marshmellow的白名单,改为使用camera1,三星似乎直到2009年才更新其摄像头,使其与camera2配合使用Marshmellow@AdrianCrețu嘿,我能知道你是如何通过openGl创建camera2 perview的吗?我需要help@RautDarpan-我已经生成了一个OpenGL纹理,并使用该纹理创建了馈送到相机捕获请求中的SurfaceTexture/Surface。其余的是OpenGL的常见操作。当然,如果你问如何进一步操纵它,细节可能会变得复杂,但这是核心。@ArkadyGamza-既然我们谈论的是曲面,你怎么知道“相机选择”是什么?3264x2448与640x480的纵横比相同,因此没有倾斜。Nexus 5在这方面对我来说工作得很好。@EddyTalvala-所以我知道这是AOSP(或三星?)中的一个缺陷,当输出到多个表面时,具有不同的输出纵横比。不幸的是,出于预览+编码的目的,这正是我正在做的。我认为你是第一个真正正确解释这一点的人,所以我将把它标记为一个答案;那会更容易修复。这是一些特定于设备的摄像头实现的一个缺陷(AOSP只是告诉摄像头硬件“给我们这些X输出的大小为a、B和C”。通常这是因为在引擎盖下,它们只有一些