подходить для записи видео в градациях серого на iphone? - PullRequest
1 голос
/ 23 марта 2011

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

Я думаю о следующих линиях:

  1. Используйте шейдер и opengl для преобразования видео в оттенки серого
  2. Используйте AVFoundation (AVAssetWriter с AVAssetWriterInputPixelBufferAdaptor), чтобы записать видео в файл.

Мои вопросы:

  1. Это правильный подход (самый простой, лучшая производительность)?
  2. Если это так, как лучше всего перейти от вывода opengl к входу CVPixelBufferRef для AVAssetWriterInputPixelBufferAdaptor?
  3. Если нет, то какой подход лучше?

Любое движение в правильном направлении очень ценится!

1 Ответ

4 голосов
/ 24 марта 2011

В общем, я бы согласился с таким подходом. Выполнение обработки в шейдере 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, которые я тестировал.

...