【发布时间】:2014-09-05 15:51:24
【问题描述】:
我的问题和下面这个问题差不多:
Switching AVCaptureSession preset when capturing a photo
但问题是(自我)答案对我没有一点帮助。我想知道是否有人知道如何做到这一点。
我正在捕获视频帧,以便处理它们并对其进行处理。为此,我使用AVCaptureSessionPrese640x480,因为我需要在获得合适的帧进行计算的同时获得所有帧速率。现在,当用户想要拍摄照片时,我希望他能够以尽可能高的分辨率拍摄照片。为此,我不赞成:
[captureSession beginConfiguration];
captureSession.sessionPreset = <some_preset>
[captureSession commitConfiguration];
我已经尝试过了,但在某些情况下会出现错误;但由于某种原因,屏幕上仍然存在一定的延迟,我不再相信这一点。
是否有明确的方法可以从相机获取高分辨率图像,同时以非常低的分辨率(例如 640x480)捕获视频输出?
【问题讨论】:
-
您可能想尝试将一些工作放到单独的线程中。由于设备同步,commitConfiguration 可能会暂停线程,如果可能的话,将其放入单独的线程中(可能有效或无效)。在任何情况下,您都应该期望在调用此方法后,您的下一帧仍可能处于低分辨率状态,因此您需要检查每一帧的样本。收到高分辨率样本后,您应该再次使用单独的线程来生成图像或您正在做的任何事情,并且还可能锁定“拍照”按钮/触发器。
-
感谢您的建议,但这对应用程序来说太糟糕了。配置也会重新聚焦,所以我永远无法让用户聚焦并点击。我想知道是否有一种标准的做事方式,因为很多人可能需要这个。
-
我相信你在这一点上已经走到了死胡同(虽然我可能是错的)。也许如果可能的话,您可以简单地捕获高分辨率样本,然后在将其馈送到视频输入之前自己对其进行下采样。为了获得一些性能,您可以尝试将其放在 GPU 上,但不能保证这将获得任何性能。我希望你找到一个好的解决方案并在这里发布。
-
Matic,我在
devforums上问了这个问题,他们说不可能。此外,这正是我现在正在做的;对缓冲区进行下采样,但调整大小是最昂贵的操作。必须将较小的图像调整为小得多的图像进行处理比调整大图像的大小要好。也许我可以将该特定任务卸载到 GPU,但正如您所说,它不能保证任何额外的性能。但是,是的,如果我有什么东西,我一定会在这里发布。 -
您知道您也可以使用一些技巧进行下采样:如果源样本比下采样大得多,您可以尝试从样本中删除每个奇数行和列,然后对其进行下采样到合适的尺寸(只是一个想法,我从未尝试过)。这应该是一个相当大的性能提升,但很难说结果会是什么样子。无论如何,如果你最终使用 GPU,你应该看看这个答案 stackoverflow.com/questions/9550297/… 它实际上可能是你的解决方案。
标签: ios objective-c image-processing avfoundation avcapturesession