安卓中的连拍模式相机可以拍摄多张照片

9
我试图在我的应用程序中实现连拍模式相机,可以以每秒5-10(或更多)张的速度拍摄多张照片。
FYI,我已经看过之前的问题hereherehere - 但是速度方面尝试失败了。而且这些问题都很旧,没有全面回答所有关注点,比如如何管理堆等。
如果有人能提供有用的指针、最佳实践或者一个SSCCE,我将不胜感激。
更新:
通过成功地拉取预览帧@15+snaps/sec进行了尝试,但问题在于预览大小受限。在nexus 5上,我只能得到1920x1080,大约为2mp,而在n5上可能的完整分辨率图片为8mp :-(

3
你是如何以每秒15帧的速度拍摄照片的?你能提供代码吗?我也遇到了同样的问题。 - Anton Shkurenko
2个回答

7

我认为问题的一个重要部分是:当前手机的连拍模式是如何工作的?一些博客指出,谷歌已经确认他们将添加一个连拍模式 API。

我猜测目前实现的方式是将曝光时间设为最小值,然后在循环中调用 takePicture 或使用 Camera.PreviewCallback

我曾经尝试过使用后者进行一些计算机视觉项目,并碰巧了解到使用此 API 编写连拍相机的方法。你可以将从 Camera.PreviewCallback 收到的缓冲区存储在内存中,并在后台线程上处理它们。

如果我没记错的话,分辨率比实际相机分辨率要低,所以这可能并不理想。


成功尝试了以每秒15帧的速度获取预览帧,但问题在于预览大小受限。在Nexus 5上,我只能获得1920x1080的分辨率,大约为2MP,而在n5上可能的全分辨率图片是8MP :-( - COD3BOY
是的,我在我的回答中提到了这一点。唯一的其他选择是设置相机设置并查看它如何影响图像处理速度,可能通过在循环中使用takePicture来使其足够快以拍摄连拍照片,但这也会影响图像的质量。 - Leon
一些传感器确实支持 burst mode,与 onPreviewFrame 分离。 但是该 API 是专有的,并且仅在 camera HAL v.3 中才有尝试让设备制造商向第三方相机应用程序公开此功能的努力。 - Alex Cohn
1
@Leon,你能提供一些例子吗?我遇到了同样的问题,但找不到答案。 - Anton Shkurenko

7

除了由制造商提供的特定于设备的API之外,唯一一种可以在多个设备上使用的“连拍模式”将是使用预览帧作为图像。 takePicture() 不能保证您何时能够再次调用 takePicture()


+1 - 成功地尝试了预览帧速率为15+ fps,但问题是预览大小受限。在Nexus 5上,我只能获得1920x1080,大约为2mp,而在n5上可能的完整分辨率图片为8mp :( 有没有办法获得完整的高分辨率图片? - COD3BOY
@COD3BOY:获取全分辨率图片的唯一方法是使用takePicture(),然后你又回到了一个问题,你不知道什么时候再次调用它才是安全的。 - CommonsWare
谢谢。那么在使用 takePicture() 时,最好的方法是什么?目前我正在将图像保存到内部存储(这里没有线程),并在 pictureCallback 中再次调用 takePicture()。在 Nexus 5 上,这样做目前可以每秒拍摄2张照片。这是最好的方式吗? - COD3BOY
@COD3BOY:这是我所知道的唯一可靠的方法。原则上,在takePicture()onPictureTaken()之间的某些时间应该用于处理,这可能不会干扰另一个takePicture()调用。您可以尝试在onPictureTaken()被调用之前更频繁地调用takePicture(),但正如俗话所说,您的效果可能会有所不同。 :-) - CommonsWare
谢谢,让我试一下,如果有什么问题会更新的 :-) - COD3BOY
CommonsWare,你说得对。大多数主要设备制造商在新设备上都有某种API可用,您可以使用不同的类来处理这些API。 "Burst Mode" 在某种程度上需要由传感器和相机驱动程序部分处理。您需要一个随时可用的缓冲区和计算任务的分配,以使其顺利进行。 - childofthehorn

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