2010-08-18 64 views
12

我正在构建一个应用程序,允许用户使用iPhone摄像头捕捉图片,并在AVFoundation可用时使用(iOS4),因此用户可以使用点击对焦功能,即使自定义覆盖。立即冻结AVCaptureSession

我遇到的问题是,captureStillImageAsynchronouslyFromConnection需要几秒钟才能完成,在此期间,我想,这样就不会有一个混乱的状态定格主视频饲料,其中的视频仍然是正在运行,但用户拍摄了一张照片(并且相机快门声已关闭)。

我试过在请求静止图像捕获后调用[会话stopRunning],但这会导致不可预知的结果;在这种情况下,静止图像完成块通常不会被触发。

关于如何在快门被击中后如何让视频预览层“暂停”的任何想法?

+0

我也是,我已经看到了其他建议,断开会话,然后将相机是完全破碎,不稳定。 – RainCast 2016-10-24 19:49:38

回答

5

我正在尝试同样的事情。虽然在我的情况下captureStillImageAsynchronouslyFromConnection需要0.5秒返回,所以也许你正在完成处理程序中做一些处理?

如果是这样的话,我想出了2个选择,这两者都是不足够的,对我来说可能会为你做

我来到得到的是两种:
*调用stopRunning在完成处理程序被调用时捕获会话(同样,在我的情况下为0.5秒),然后再处理后再调用startRunning
*在叠加层上有一个UIImageView,并在您处理时存储最后拍摄的照片,无论是来自相机还是视频流。

两种解决方案让我感到沮丧的是,它们都为这个过程增加了几秒钟的时间。但我希望它有帮助,或者给出一个方向。

干杯, Oded。

+0

经过多次尝试,这是正确的答案。 – RainCast 2016-10-25 22:52:56

4

简单的冻结框架给了用户一个印象,即屏幕上的图像已被拍摄,至少是假的,我会显示一个变暗的图像。 Camera.app通过关闭“快门”来解决问题。

您或许可以将AVCaptureVideoPreviewLayer alpha更改为0.5,从而给出变暗图像的印象,即使它仍在运行。

另一种选择是使用AVCaptureVideoDataOutput和一些图像操作来获取静止图像。不幸的是,似乎不可能同时使用AVCaptureVideoDataOutput和AVCaptureStillImageOutput;一种解决方法是通过抓取下一个视频帧来实现“拍摄照片”功能(当然,这受限于视频分辨率,但如果您只是想在帧上进行图像处理,那很好)。

0

旧的答案,但这里有一个好奇的更新:在iOS5中,您可以同时使用AVCaptureStillImageOutput和AVCaptureVideoDataOutput。我在拍摄下一个视频帧和静止图像时取得了不错的成功。我使用一个简单的淡出动画来隐藏UI,然后在从AVCaptureVideoDataOutput获取图像时淡入。此过程比通过AVCaptureStillImageOutput的captureStillImageAsynchronouslyFromConnection:completionHandler:等待静止图像的速度要快得多,这很可能是由于来自AVCaptureVideoDataOutput的较小和较低质量的图像造成的。

16

你只需要设置你的captureVideoPreviewLayer.connection.enabled = NO;

有关详细信息,请参阅我的答案在这里:

AVCaptureSession pause?

+0

尝试过这一点,并导致相机中出现一些奇怪的行为。 – RainCast 2016-10-24 19:52:39

+0

奇怪的行为,包括拍摄看起来非常蓝的照片....有时在曝光时很暗。 – RainCast 2016-10-25 22:34:45

+0

在哪个iOS版本中,你有那些奇怪的行为? – DisableR 2016-10-27 07:21:38