我正在构建一个应用程序,允许用户使用iPhone相机拍照,并在可用时使用AVFoundation(iOS4),这样用户即使使用自定义叠加也可以使用点击对焦功能。
我遇到的问题是 captureStillImageAsynchronouslyFromConnection 需要几秒钟才能完成,在此期间我想冻结主要视频供稿,这样就没有了视频仍在运行的混乱状态,但用户已拍摄照片(并且相机快门声已关闭)。
我在请求静止图像捕获后立即尝试调用[session stopRunning],但这会导致不可预测的结果;在这种情况下,静止图像完成块通常不会被触发。
关于如何在快门被击中时让视频预览图层“暂停”的任何想法?
答案 0 :(得分:18)
答案 1 :(得分:5)
我正在尝试同样的事情。虽然在我的情况下 captureStillImageAsynchronouslyFromConnection 需要0.5秒才能返回,所以也许你在完成处理程序中进行了一些处理?
如果是这样的话,我想出了两个选项,这两个选项对我来说都不够,但可能会为你做好
我想出的是:
*调用完成处理程序时,在捕获会话上调用 stopRunning (在我的情况下再次为0.5秒),然后在处理调用 startRunning <之后/ em> 再次。
*在叠加层顶部有一个UIImageView,并在您进行处理时将相机或视频流中的最后一张照片存储在此imageview中。
这两个解决方案让我气馁的是,他们都为这个过程添加了几秒钟。但我希望它有所帮助,或者给出方向。
干杯, 奥德。
答案 2 :(得分:4)
简单的冻结框架让用户感觉屏幕上的图像已被拍摄,这是错误的 - 至少,我会显示一个暗淡的图像。 Camera.app通过关闭“快门”来解决问题。
您可以将AVCaptureVideoPreviewLayer alpha更改为0.5,以便给出灰度图像的印象,即使它仍然在运行。
另一种选择是使用AVCaptureVideoDataOutput和一些图像处理来获取静止图像。不幸的是,似乎无法同时使用AVCaptureVideoDataOutput和AVCaptureStillImageOutput;一种解决方法是通过抓取下一个视频帧来实现“拍照”功能(当然,这受到视频分辨率的限制,但如果您只是想在帧上进行图像处理则可以。)
答案 3 :(得分:0)
旧答案,但这里是好奇的更新:在iOS5中,您可以同时使用AVCaptureStillImageOutput和AVCaptureVideoDataOutput。我在获得下一个视频帧和静止图像时取得了不错的成功。我使用一个简单的淡出动画来隐藏UI,然后当我从AVCaptureVideoDataOutput返回图像时淡入淡出。此过程比通过AVCaptureStillImageOutput的captureStillImageAsynchronouslyFromConnection:completionHandler:
等待静止图像快得多,这很可能是由于AVCaptureVideoDataOutput出现的质量较低和较低的图像。