我的目标是编写一个自定义相机视图控制器,它可以:
由于要求(3),我需要降级到AVFoundation。
我从Technical Q&A QA1702开始,并进行了以下更改:
首先,我从
此时,帧速已经低于会话视频输出中指定的15 FPS,当我添加效果时,它会降到10以下。很快应用程序由于低内存而崩溃。
我在iPhone 4上将帧速降至9 FPS,在iPod Touch(第四代)上将其降至8 FPS,取得了一些成功。
我还添加了一些代码来“刷新”调度队列,但我不确定它实际上有多大帮助。基本上,每8-10帧,设置一个标志,指示
此时,我甚至不介意低帧速率,但显然我们无法使用低内存崩溃的应用程序。有人有任何想法如何采取措施防止这种情况下的低内存条件(和/或更好的“刷新”调度队列方式)吗?
- 在所有四个界面方向下使用前置和后置摄像头拍照。
- 正确旋转和缩放预览"视频"以及全分辨率照片。
- 允许对预览"视频"和全分辨率照片应用(简单的)效果。
由于要求(3),我需要降级到AVFoundation。
我从Technical Q&A QA1702开始,并进行了以下更改:
- 将sessionPreset更改为AVCaptureSessionPresetPhoto。
- 在启动会话之前添加AVCaptureStillImageOutput作为附加输出。
首先,我从
captureOutput:didOutputSampleBuffer:fromConnection:
的样本缓冲区中获取UIImage结果的imageFromSampleBuffer:
。然后,我使用CGGraphicsContext将其缩放和旋转到屏幕上。此时,帧速已经低于会话视频输出中指定的15 FPS,当我添加效果时,它会降到10以下。很快应用程序由于低内存而崩溃。
我在iPhone 4上将帧速降至9 FPS,在iPod Touch(第四代)上将其降至8 FPS,取得了一些成功。
我还添加了一些代码来“刷新”调度队列,但我不确定它实际上有多大帮助。基本上,每8-10帧,设置一个标志,指示
captureOutput:didOutputSampleBuffer:fromConnection:
立即返回而不处理该帧。在输出调度队列上的同步操作完成后,重置标志。此时,我甚至不介意低帧速率,但显然我们无法使用低内存崩溃的应用程序。有人有任何想法如何采取措施防止这种情况下的低内存条件(和/或更好的“刷新”调度队列方式)吗?
captureOutput:didOutputSampleBuffer:fromConnection:
之后将实际处理转移到后台,然后回到主线程更新UI。这种方法确实可以解决问题,这也是苹果在WWDC上展示的GLVideoFrame示例所采用的方法(当然,OpenGL处理非常快)。 - gerry3