Моя цель — написать собственный контроллер просмотра камеры, который:
- Можно делать фотографии во всех четырех ориентациях интерфейса как на заднюю, так и на переднюю камеру, если она доступна.
- Правильно поворачивает и масштабирует превью «видео», а также фото в полном разрешении.
- Позволяет применять (простой) эффект ОБА к предварительному просмотру «видео» и фотографии с полным разрешением.
Реализация (на iOS 4.2/Xcode 3.2.5):
Из-за требования (3) мне нужно было перейти к AVFoundation.
Я начал с Технических вопросов и ответов QA1702 и внес следующие изменения:
- Изменен sessionPreset на AVCaptureSessionPresetPhoto.
- Добавлен AVCaptureStillImageOutput в качестве дополнительного вывода перед запуском сеанса.
Проблема, с которой я сталкиваюсь, связана с производительностью обработки изображения предварительного просмотра (кадр предварительного просмотра «видео»).
Во-первых, я получаю результат UIImage imageFromSampleBuffer:
в образце буфера из captureOutput:didOutputSampleBuffer:fromConnection:
. Затем я масштабирую и поворачиваю его для экрана, используя CGGraphicsContext.
На данный момент частота кадров уже ниже 15 кадров в секунду, которые указаны в видеовыходе сеанса, и когда я добавляю эффект, она падает ниже или около 10. Приложение быстро падает из-за нехватки памяти.
Мне удалось снизить частоту кадров до 9 кадров в секунду на iPhone 4 и до 8 кадров в секунду на iPod Touch (4-го поколения).
Я также добавил некоторый код для «очистки» очереди отправки, но я не уверен, насколько это на самом деле помогает. По сути, каждые 8-10 кадров устанавливается флаг, который сигнализирует captureOutput:didOutputSampleBuffer:fromConnection:
о немедленном возврате, а не об обработке кадра. Флаг сбрасывается после завершения операции синхронизации в выходной очереди диспетчеризации.
На данный момент я даже не возражаю против низкой частоты кадров, но очевидно, что мы не можем выпускать игру с нехваткой памяти. Кто-нибудь знает, как принять меры, чтобы предотвратить нехватку памяти в этом случае (и/или лучший способ «сбросить» очередь отправки)?