Подтвердить что ты не робот

Как применить фильтры к AVCaptureVideoPreviewLayer

В настоящее время мое приложение использует AVFoundation для получения необработанных данных камеры с задней камеры iPhone и отображения их на AVCaptureVideoPreviewLayer в режиме реального времени.

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

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

Это единственный способ достичь моей цели?

Как я уже упоминал, я не собираюсь захватывать ни одно из видео AVCaptureSession, просто просматриваю его.

4b9b3361

Ответ 1

Вероятно, наиболее эффективным способом обработки этого было бы использование OpenGL ES для фильтрации и отображения этих видеокадров. Вы не сможете многое сделать с AVCaptureVideoPreviewLayer напрямую, кроме корректировки его непрозрачности при наложении на другой вид или слой.

У меня есть пример приложения здесь, где я беру кадры из камеры и применяю шейдеры OpenGL ES 2.0 для обработки видео в реальном времени для отображения. В этом приложении (подробно описано здесь), я использовал фильтрацию на основе цвета для отслеживания объектов в режиме просмотра камеры, но другие изменили этот код чтобы сделать некоторые аккуратные эффекты обработки видео. Все фильтры на основе GPU в этом приложении, отображаемые на экране, работают на 60 FPS на моем iPhone 4.

Единственное устройство iOS, поддерживающее видео, но не имеющее GPU с поддержкой OpenGL ES 2.0, - это iPhone 3G. Если вам нужно настроить таргетинг на это устройство, вы можете взять базовый код для захвата видео и генерации текстур OpenGL ES, а затем использовать код фильтра из Apple GLImageProcessing. Это приложение построено на OpenGL ES 1.1, поддержка которого присутствует на всех устройствах iOS.

Тем не менее, я настоятельно рекомендую использовать OpenGL ES 2.0 для этого, потому что вы можете использовать гораздо больше видов эффектов, используя шейдеры, чем вы можете с помощью конвейера OpenGL ES 1.1 с фиксированной функцией.

(Редактирование: 2/13/2012) Как обновление выше, я создал структуру с открытым исходным кодом под названием GPUImage, который инкапсулирует такую ​​фильтрацию пользовательских изображений. Он также обрабатывает захват видео и отображает его на экране после фильтрации, требуя всего шесть строк кода, чтобы установить все это. Подробнее о структуре вы можете прочитать мое более подробное объявление.

Ответ 2

Я бы рекомендовал посмотреть пример Rosy Writer из библиотеки разработки ios. Брэд Ларсон Библиотека GPUImage довольно удивительна, но для этого вопроса кажется немного излишним.

Если вам просто интересно добавлять шейдеры OpenGL (aka Filters) в AVCaptureVideoPreviewLayer, рабочий процесс должен отправить вывод сеанса захвата в представление OpenGL для рендеринга.

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(_renderer.inputPixelFormat) };
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];

Затем в делегате captureOutput: отправьте буфер образца в OpenGL Renderer

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CVPixelBufferRef sourcePixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
    _renderer copyRenderedPixelBuffer:sourcePixelBuffer];
}

В OpenGL Renderer привяжите sourcePixelBuffer к текстуре, и вы можете отфильтровать ее в шейдерах OpenGL. Шейдер - это программа, которая запускается на основе перпикселя. Пример Rosy Writer также показывает примеры использования различных методов фильтрации, отличных от OpenGL.