Aplicando efeito ao "Video" da visualização da câmera do iPhone

Meu objetivo é escrever um controlador de visualização de câmera personalizado que:

Pode tirar fotos nas quatro orientações da interface com a câmera traseira e, quando disponível, frontal.Gira e dimensiona adequadamente o "vídeo" de visualização, bem como a foto em resolução total.Permite que um efeito (simples) seja aplicado a AMBOS o "vídeo" de visualização e a foto em resolução total.

Implementação (no iOS 4.2 / Xcode 3.2.5):

Devido ao requisito (3), eu precisava ir para o AVFoundation.

Eu comecei comPerguntas e Respostas Técnicas QA1702 e fez essas alterações:

A sessionPreset foi alterada para AVCaptureSessionPresetPhoto.Adicionado um AVCaptureStillImageOutput como uma saída adicional antes de iniciar a sessão.

O problema que estou enfrentando é com o desempenho do processamento da imagem de visualização (um quadro da visualização de "vídeo").

Primeiro, recebo o resultado UIImage deimageFromSampleBuffer: no buffer de amostra decaptureOutput:didOutputSampleBuffer:fromConnection:. Em seguida, redimensiono e giro para a tela usando um CGGraphicsContext.

Nesse ponto, a taxa de quadros já está abaixo dos 15 FPS especificados na saída de vídeo da sessão e, quando adiciono o efeito, cai para menos ou em torno de 10. Rapidamente, o aplicativo trava devido à pouca memória.

Eu tive algum sucesso ao reduzir a taxa de quadros para 9 FPS no iPhone 4 e 8, FPS no iPod Touch (4ª geração).

Também adicionei algum código para "liberar" a fila de despacho, mas não tenho certeza de quanto isso realmente está ajudando. Basicamente, a cada 8 a 10 quadros, é definido um sinalizador que sinalizacaptureOutput:didOutputSampleBuffer:fromConnection: para retornar imediatamente em vez de processar o quadro. O sinalizador é redefinido após a conclusão de uma operação de sincronização na fila de despacho de saída.

Neste ponto, eu nem me importo com as baixas taxas de quadros, mas obviamente não podemos enviar com as falhas de pouca memória. Alguém tem alguma idéia de como tomar medidas para evitar as condições de pouca memória nesse caso (e / ou uma maneira melhor de "liberar" a fila de despacho)?

questionAnswers(2)

yourAnswerToTheQuestion