如何获取720p Android相机预览数据?

9

我希望使用相机预览进行图像识别。为了我的目的,我需要预览分辨率尽可能高(同时向用户显示预览)。

我创建了一个继承SurfaceView类并设置PreviewSize为1280x720的Preview类。我添加了一个PreviewCallBack来获取实时图像:

camera = Camera.open();

parameters = camera.getParameters();
parameters.setPreviewSize(1280,720);

camera.setParameters( parameters);
byte[] b = new byte[camera.getParameters().getPreviewSize().width *
  camera.getParameters().getPreviewSize().height *
  ImageFormat.getBitsPerPixel(camera.getParameters().getPreviewFormat()) / 8];
camera.addCallbackBuffer(b);
camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback());

try {
 camera.setPreviewDisplay(this.getHolder());
 camera.startPreview()
}

我的字节数组b有1382400个字节,我的CameraPreviewCallback.onPreviewFrame()函数接收这些1382400个字节,但是只有前497664个字节包含数据(与768x432分辨率(HTC Desire)相匹配)。 我在不同设备上进行了测试,所有设备的显示分辨率均为800x480(HTC Desire,LG Optimus 3D,Samsung Galaxy S2,Samsung Galaxy Tab等)。 我的代码仅适用于HTC Desire HD设备。 有人知道如何将完整的720p分辨率作为字节数组接收吗? “某些东西”似乎会减小预览分辨率以适应智能手机屏幕。 祝好。Joern

你确定你的手机支持720p吗?Logcat有没有显示任何信息(比如“无法设置分辨率”)? - Lennart
是的,720p作为预览尺寸在所有设备上都得到支持。Logcat没有显示任何特殊信息 - 看起来好像“某些东西”在默默地降低预览分辨率。 - Jörn Buitink
getPreviewSize() 返回正确的尺寸吗? - Lennart
刚在我的Desire上测试了一下,可以证实这个问题。预览大小是支持的并且有效,但返回的预览数据比这里描述的要小。非常奇怪。 - user658042
2个回答

8

摄像头预览不能使用任意分辨率。

某些设备只支持特定的分辨率。您可以通过Camera.Parameters.getSupportedPreviewSizes()¹查询这些分辨率。如果您的设备在此列表中没有返回1280x720,则无法使用它。请选取一个接近所需分辨率的支持分辨率。

¹ 一般情况下,在使用任何分辨率(包括720p)之前,您都应该这样做。


2
很不幸,1280x720p在所有列出的设备列表中都存在。我已经检查了SupportedPreviewSizes。 - Jörn Buitink

2
虽然这是一个老问题,但答案没有改变:每个设备支持的预览尺寸列表不准确。据我所知,默认的预览尺寸始终有效。其他尺寸似乎只能在特定情况下工作 - 您可以相当有信心地认为默认预览尺寸在屏幕上看起来不会出错,但仅此而已。特别是,即使“支持”,该字节数组也不会缩放以适应更大的图像格式,并且只有部分“支持”的预览尺寸将以分辨率正确呈现且不带有绿色/粉红色失真。
唯一可靠的方法是手动测试以确保分辨率正确且onPreviewFrame()中的数据良好。

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