Я пытаюсь сделать живой фильтр камеры, как Instagram и Path. Так как я не достаточно опытен, чтобы справиться с OpenGL ES. Вместо этого я использую CoreImage для iOS 5.
Я использую этот метод обратного вызова для перехвата и фильтрации каждого кадра с камеры:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
Предустановка сеанса, которую я использую: AVCaptureSessionPresetPhoto , так как в конце мне нужно сделать высококачественные фотографии.
Если бы я просто представил буфер на экране без какой-либо фильтрации CIImage, средний FPS достиг бы 26 или даже больше, что здорово.
Если я начну применять некоторые CIF-фильтры к данным изображения, FPS упадет до 10 или даже ниже. Живое видео начало бы выглядеть плохо.
Я понимаю, что Instagram и Path будут использовать OpenGL ES напрямую, а не обернутые фреймворки, такие как CoreImage, чтобы они могли создавать более эффективный код для визуализации с помощью графического процессора. В то же время, я также заметил, что Instagram фактически снижает качество видео, чтобы еще больше снизить нагрузку на GPU. Ниже приведен снимок экрана, который я сделал, когда мое приложение (слева) и Instagram (справа) захватывают живое видео. Обратите внимание на буквы Z и S на обеих картинках. Вы видите, что качество видео в Instagram немного ниже моего.
Итак, сейчас я рассматриваю различные способы снижения качества живого видеокадра. Но я действительно понятия не имею, какой путь лучше. И как мне это реализовать.
- Попробуйте уменьшить это (CMSampleBufferRef) sampleBuffer качество перед его преобразованием в объект CIImage.
- Попробуйте найти некоторые API из CIImage или CIFilter или CIContext, чтобы снизить качество видеокадра.
- Попробуйте найти некоторые API из OpenGL ES для снижения качества видеокадра.
Опять же, у меня сейчас нет никаких улик. Так что любые предложения будут с благодарностью!