В общем, я бы согласился с таким подходом. Выполнение обработки в шейдере OpenGL ES 2.0 должно быть наиболее эффективным способом изменения видеокадров, как это, но это будет не очень просто. К счастью, вы можете начать с уже существующего шаблона, который уже делает это.
Вы можете использовать образец приложения, которое я написал здесь (и объяснил здесь ) в качестве основы. В этом примере я использую пользовательские шейдеры для отслеживания цветов на изображении, но вы можете легко изменить это, чтобы преобразовать видеокадры в оттенки серого (я даже видел, как кто-то делал это однажды). Код для подачи видео с камеры в текстуру и его обработки можно использовать дословно из этого примера.
В одном из вариантов отображения в этом приложении я рендерил обработанное изображение сначала в объект кадрового буфера, а затем с помощью glReadPixels()
перетаскиваю полученное изображение обратно в байты, с которыми я могу работать на ЦП. Вы можете использовать это, чтобы получить необработанные данные изображения после того, как графический процессор обработал кадр, а затем передать эти байты в CVPixelBufferCreateWithBytes()
, чтобы сгенерировать ваш CVPixelBufferRef для записи на диск.
(Редактирование: 29.02.2012). В качестве обновления к этому я только что реализовал этот вид видеозаписи в моей открытой структуре GPUImage , чтобы я мог прокомментировать конкретную производительность для кодирования часть этого. Оказывается, что вы можете захватывать видео с камеры, выполнять живую фильтрацию, захватывать его из OpenGL ES, используя glReadPixels()
, и записывать это как живое видео H.264 в 640x480 кадрах на iPhone 4 со скоростью 30 кадров в секунду ( максимальная частота кадров камеры).
Было несколько вещей, которые мне нужно было сделать, чтобы получить такую скорость записи. Вы должны убедиться, что вы установили свой AVAssetWriterInputPixelBufferAdaptor для использования kCVPixelFormatType_32BGRA
в качестве цветового формата для буферов входных пикселей. Затем вам нужно будет повторно визуализировать вашу RGBA-сцену с использованием цветного шейдера, чтобы обеспечить вывод BGRA при использовании glReadPixels()
. Без этой цветовой настройки частота кадров вашей видеозаписи упадет до 5-8 FPS на iPhone 4, где при этом они легко достигают 30 FPS. Вы можете посмотреть исходный код класса GPUImageMovieWriter, чтобы узнать больше о том, как я это сделал.
Используя платформу GPUImage, вышеупомянутая задача фильтрации и кодирования может быть выполнена путем простого создания GPUImageVideoCamera, присоединения цели GPUImageSaturationFilter с насыщением, установленным в 0, и затем присоединения GPUImageMovieWriter в качестве цели этого. Фреймворк будет обрабатывать взаимодействия OpenGL ES для вас. Я сделал это, и он хорошо работает на всех устройствах iOS, которые я тестировал.