我的目标是编写一个自定义的相机视图控制器:
- 可以使用后置摄像头和前置摄像头(如果有的话)在所有四个界面方向上拍照。
- 正确旋转和缩放预览“视频”以及全分辨率照片。
- 允许将(简单)效果应用于预览“视频”和全分辨率照片。
实现(在 iOS 4.2 / Xcode 3.2.5 上):
由于要求(3),我需要下拉到 AVFoundation。
我从技术问答 QA1702开始并进行了以下更改:
- 将 sessionPreset 更改为 AVCaptureSessionPresetPhoto。
- 在开始会话之前添加了 AVCaptureStillImageOutput 作为附加输出。
我遇到的问题是处理预览图像(预览“视频”的帧)的性能。
首先,我imageFromSampleBuffer:
从captureOutput:didOutputSampleBuffer:fromConnection:
. 然后,我使用 CGGraphicsContext 为屏幕缩放和旋转它。
此时,帧速率已经低于会话视频输出中指定的 15 FPS,当我添加效果时,它会下降到 10 以下或左右。由于内存不足,应用程序很快就会崩溃。
我在将 iPhone 4 的帧速率降低到 9 FPS 并将 iPod Touch(第 4 代)的帧速率降低到 8 FPS 方面取得了一些成功。
我还添加了一些代码来“刷新”调度队列,但我不确定它实际上有多大帮助。基本上,每 8-10 帧,就会设置一个标志,指示captureOutput:didOutputSampleBuffer:fromConnection:
立即返回而不是处理该帧。在输出调度队列上的同步操作完成后,该标志被重置。
在这一点上,我什至不介意低帧率,但显然我们不能在低内存崩溃的情况下发货。任何人都知道在这种情况下如何采取措施来防止内存不足的情况(和/或“刷新”调度队列的更好方法)?