Начиная с iOS 4.0, вы можете использовать AVCaptureDeviceInput
, чтобы получить камеру в качестве устройства ввода и подключить ее к AVCaptureVideoDataOutput
с любым объектом, который вы захотите установить в качестве делегата. Установив 32-битный формат BGRA для камеры, объект делегата будет получать каждый кадр с камеры в формате, который идеально подходит для немедленной передачи до glTexImage2D
(или glTexSubImage2D
, если устройство не поддерживает не-мощность две текстуры, я думаю, что устройства MBX попадают в эту категорию).
Существует множество параметров размера и частоты кадров; по-видимому, вам придется настроить их в зависимости от того, для чего еще вы хотите использовать графический процессор. Я обнаружил, что совершенно тривиальная сцена с только текстурированным квадратом, показывающим последний кадр, перерисованный только точно, когда новый кадр поступает на iPhone 4, смогла отобразить максимальную скорость передачи 720p 24 кадра в секунду без заметной задержки. Я не провел более тщательного бенчмаркинга, чем этот, так что, надеюсь, кто-то еще может посоветовать.
В принципе, в соответствии с API, кадры могут возвращаться с некоторым заполнением в памяти между линиями сканирования, что будет означать некоторое перетасовывание содержимого перед отправкой в GL, поэтому вам необходимо реализовать путь кода для этого. На практике, говоря чисто эмпирически, похоже, что текущая версия iOS никогда не возвращает изображения в такой форме, поэтому это не является проблемой производительности.
РЕДАКТИРОВАТЬ: сейчас очень близко к трем годам позже. Тем временем Apple выпустила iOS 5, 6 и 7. С 5 они представили CVOpenGLESTexture
и CVOpenGLESTextureCache
, которые теперь являются умным способом передачи видео с устройства захвата в OpenGL. Apple предоставляет образец кода здесь , из которого наиболее интересные части находятся в RippleViewController.m
, в частности его setupAVCapture
и captureOutput:didOutputSampleBuffer:fromConnection:
- см. Строки 196–329. К сожалению, положения и условия не допускают дублирования кода здесь без прикрепления всего проекта, но пошаговая настройка:
- создать
CVOpenGLESTextureCacheCreate
и AVCaptureSession
;
- захватить подходящий
AVCaptureDevice
для видео;
- создать
AVCaptureDeviceInput
с этим устройством захвата;
- присоедините
AVCaptureVideoDataOutput
и скажите, чтобы он вызывал вас в качестве примера делегата буфера.
После получения каждого буфера для образцов:
- получить
CVImageBufferRef
от него;
- используйте
CVOpenGLESTextureCacheCreateTextureFromImage
для получения Y и UV CVOpenGLESTextureRef
с из буфера CV-изображений;
- получить текстурные цели и имена из текстурных ссылок CV OpenGLES, чтобы связать их;
- объединяет яркость и цветность в вашем шейдере.