Понизьте качество видео для более высокого FPS при живой фильтрации с использованием CIImage - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь сделать живой фильтр камеры, как 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 немного ниже моего.

Итак, сейчас я рассматриваю различные способы снижения качества живого видеокадра. Но я действительно понятия не имею, какой путь лучше. И как мне это реализовать.

  1. Попробуйте уменьшить это (CMSampleBufferRef) sampleBuffer качество перед его преобразованием в объект CIImage.
  2. Попробуйте найти некоторые API из CIImage или CIFilter или CIContext, чтобы снизить качество видеокадра.
  3. Попробуйте найти некоторые API из OpenGL ES для снижения качества видеокадра.

Опять же, у меня сейчас нет никаких улик. Так что любые предложения будут с благодарностью!

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 января 2012

Если вы не хотите снижать качество видео (и я думаю, что AVCaptureSessionPresetPhoto в любом случае довольно низок), вам лучше всего либо оптимизировать фильтры, либо снизить частоту кадров.

Вы можете подумать, ну, я уже получаю более низкую частоту кадров.Тем не менее, установка этого заранее оптимизирует способ удаления кадров.Итак, если вы получаете 10 кадров в секунду сейчас, попробуйте установить максимальную частоту кадров, скажем, 15, и вы можете просто получить эти 15 кадров в секунду - это хорошо для предварительного просмотра.

(я работал над Flare , в одном из самых требовательных приложений itun.es/iLQ3bR.)

0 голосов
/ 30 декабря 2011

AVcaptureSession имеет свойство sessionPreset, которое позволяет качеству видео устанавливать низкий средний или высокий.

Ниже кодового качества установлено среднее.

[self.mSession setSessionPreset:AVCaptureSessionPresetMedium];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...