Android Camera2 输出尺寸

13

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

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

三星Galaxy Tab S的最大预览尺寸为1440x1080像素,分辨率为2560x1600像素。因此,我的预览尺寸为1440x1080像素,TextureView表面尺寸为2560x1600像素,因此图像被扭曲了。

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

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

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

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


所以我的预览尺寸是1440x1080像素,而TextureView的表面尺寸是2560x1600像素,所以图像失真了。这是因为你们的纵横比不一样。你需要使TextureView具有与相机预览图像相同的纵横比,可以使用负边距将其在一个轴上调整为大于屏幕尺寸。 - CommonsWare
我知道这个,但为什么预览的尺寸这么小呢?在三星Galaxy S4上,预览尺寸是1920 x 1080(与分辨率相同),并且显示图像没有任何问题。 - piotrpawlowski
1
我知道这个问题,但为什么预览尺寸如此之小?-- 我猜你得问三星公司了。 - CommonsWare
4
像很多其他制造商一样,三星今天并没有全心全意地采用Camera2 API。他们实现了它,因为它在Lollipop上是必需的,但除了Nexus设备,如果你使用已弃用的Camera API,会得到更好的服务。你会发现,一些Camera2的高级功能无法正常工作,而其他功能则基本上通过旧版HAL实现。 - Alex Cohn
1
谢谢,这是重要的信息。我不会在这个问题上浪费时间。 - piotrpawlowski
显示剩余4条评论
2个回答

5

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

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

--> 因此,SCALER_STREAM_CONFIGURATION_MAP可能会返回与Camera API1可访问的不同分辨率。 这就是为什么您会得到

最大预览尺寸为1440x1080像素

真正令我震惊的是,这个问题是4年前提出的...仍然有一些制造商没有关心升级到Camera API2。 虽然Camera API2提供了更多功能,但也许Camera API1并没有死。

希望能提供一些分段信息,至少知道使用Camera API2时实际目标设备的数量(并非所有Android L及以上版本都支持,因为存在LEGACY支持,开发人员应该知道这一点)。


4

替换

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

to

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

3
我不是100%确定,但这将为您提供静态拍摄的支持尺寸,而非预览的支持尺寸。 - Tim Autin
Size[] getOutputSizes (Class<T> klass) 只返回 PRIVATE 图像格式的尺寸。一些支持的类可能支持 PRIVATE 以外的其他格式。例如,ImageReader 还支持 YUV_420_888。SurfaceTexture 也可以接受 YUV_420_888 或 NV21。 - Alex Cohn
对于未来的读者,请不要使用推荐的解决方案,因为设备可能不支持 ImageFormat.JPEG。我曾经见过一台三星设备不支持它,但不记得是哪一款了。文档(https://developer.android.com/reference/android/hardware/camera2/params/StreamConfigurationMap#getOutputSizes(int))指出,“`StreamConfigurationMap.getOutputSizes(int format)的输入应该是StreamConfigurationMap.getOutputFormats()` 中的一个”。 - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接