【问题标题】:Android Camera2 Output sizesAndroid Camera2 输出大小
【发布时间】:2015-07-11 21:52:21
【问题描述】:

我已经在 Android Lollipop 上测试了新的 Camera2 API。我想获取支持的预览尺寸:

StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class);

在分辨率为 2560x1600 像素的三星 Galaxy Tab S 上,最大预览尺寸为 1440x1080 像素。所以我的 previewSize 是 1440x1080px 和 TextureView 表面尺寸是 2560x1600px 所以图像是扭曲的。

我测试了已弃用的旧相机 API。

Camera.Parameters parameters =  camera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPictureSizes();

上面的代码返回 32 种不同的预览尺寸组合,例如:2560x19201920x10801080x19202560x2560 等。在这种情况下,我可以选择最佳尺寸并显示正确的图像。

我不知道如何强制新 API 获得最佳大小。我知道解决方案是缩小显示预览的视图,但内置相机应用程序可以在全屏模式下正常工作。 提前感谢所有建议!

【问题讨论】:

  • “所以我的 previewSize 是 1440x1080px 和 TextureView 表面尺寸是 2560x1600px 所以图像失真” - 那是因为你的纵横比不一样。您需要使TextureView 与相机预览图像具有相同的纵横比,例如使用负边距使其在一个轴上大于您的屏幕。
  • 我知道,但为什么预览尺寸这么小?在三星 Galaxy S4 上预览尺寸为 1920 x 1080(与分辨率相同),显示图像没有问题。
  • "我知道,但是为什么预览尺寸这么小?" -- 我怀疑你得问问三星。
  • 三星和今天的许多其他制造商一样,还没有(还没有?)全心全意地接受 Camera2 API。他们确实实现了它,因为它在 Lollipop 上是必需的,但除了 Nexus 设备之外,如果您使用已弃用的 Camera API,您今天会得到更好的服务。你会发现Camera2的一些高级功能不起作用,而另外一些基本上是通过旧的HAL实现的。
  • 谢谢,这是重要信息。我不会在这个问题上浪费时间。

标签: android android-camera android-5.0-lollipop


【解决方案1】:

正如@Alex Cohn 所说,采用 Camera API2 取决于制造商。

您可以检查相机 API2 是否支持 camCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); 返回一个 int 对应于相机 API2 的 level of support。 如果您获得的级别等于CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,基本上您的手机制造商不支持Camera API2。

--> 因此,SCALER_STREAM_CONFIGURATION_MAP 可能会返回与相机 API1 可访问的分辨率不同的分辨率。 这就是你得到的原因

最大预览尺寸为 1440x1080px

真正让我震惊的是,这个问题是在 4 年前提出的……仍然有制造商不愿意升级到 Camera API2。 虽然 Camera API2 为您提供了更多功能,但也许 Camera API1 并没有死。

如果您使用 Camera API2,至少可以知道您实际针对多少设备(由于支持 LEGACY,因此开发人员应该知道这一点,因此并非所有的 Android L 及更高版本)。 p>

【讨论】:

    【解决方案2】:

    替换

    Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
    

    Size[] sizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG)
    

    【讨论】:

    • 我不能 100% 确定,但这将为您提供静态捕获支持的大小,而不是预览。
    • Size[] getOutputSizes (Class&lt;T&gt; klass) 仅返回 PRIVATE 图像格式的大小。一些受支持的类可能支持 PRIVATE 之外的其他格式。例如,ImageReader 也支持 YUV_420_888。 SurfaceTexture 也可以接受 YUV_420_888 或 NV21。
    • 对于以后的读者,不要使用推荐的解决方案,因为设备可能不支持ImageFormat.JPEG。我见过一款三星设备不支持它,不记得到底是哪一款。文档 (developer.android.com/reference/android/hardware/camera2/params/…) 读取“StreamConfigurationMap.getOutputSizes(int format) 的输入应该是 StreamConfigurationMap.getOutputFormats() 之一”
    猜你喜欢
    • 2017-02-23
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多