私の目標は、次のようなカスタム カメラ ビュー コントローラーを作成することです。
- 背面カメラと、可能な場合は前面カメラの両方を使用して、4 つのインターフェースのすべての向きで写真を撮ることができます。
- プレビュー「ビデオ」とフル解像度の写真を適切に回転およびスケーリングします。
- プレビュー「ビデオ」とフル解像度の写真の両方に (単純な) 効果を適用できます。
実装 (iOS 4.2 / Xcode 3.2.5):
要件 (3) により、AVFoundation にドロップダウンする必要がありました。
Technical Q&A QA1702から始めて、次の変更を加えました。
- sessionPreset を AVCaptureSessionPresetPhoto に変更しました。
- セッションを開始する前に、追加の出力として AVCaptureStillImageOutput を追加しました。
私が抱えている問題は、プレビュー画像 (プレビュー「ビデオ」のフレーム) の処理のパフォーマンスにあります。
imageFromSampleBuffer:
まず、サンプル バッファの UIImage の結果を から取得しcaptureOutput:didOutputSampleBuffer:fromConnection:
ます。次に、CGGraphicsContext を使用して、画面に合わせて拡大縮小および回転します。
この時点で、フレーム レートは、セッションのビデオ出力で指定されている 15 FPS を既に下回っており、エフェクトを追加すると、10 未満または約 10 まで低下します。メモリ不足のため、すぐにアプリがクラッシュします。
iPhone 4 ではフレーム レートを 9 FPS に、iPod Touch (第 4 世代) では 8 FPS にフレーム レートを下げることに成功しました。
ディスパッチ キューを「フラッシュ」するためのコードもいくつか追加しましたが、実際にどれだけ役立つかはわかりません。基本的に、8 ~ 10 フレームごとに、フレームをcaptureOutput:didOutputSampleBuffer:fromConnection:
処理するのではなく、すぐに戻るように信号を送るフラグが設定されます。このフラグは、出力ディスパッチ キューでの同期操作が完了するとリセットされます。
現時点では、フレーム レートが低いことは気にしませんが、明らかに、メモリ クラッシュが少ない状態で出荷することはできません。この場合のメモリ不足の状態を防ぐためのアクションを実行する方法(および/またはディスパッチキューを「フラッシュ」するより良い方法)を知っている人はいますか?