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