Возможно ли использовать видео (предварительно рендеринг, сжатый с H.264) в качестве текстуры для GL в iOS?
Если возможно, как это сделать? И любое качество воспроизведения/частота кадров или ограничения?
Возможно ли использовать видео (предварительно рендеринг, сжатый с H.264) в качестве текстуры для GL в iOS?
Если возможно, как это сделать? И любое качество воспроизведения/частота кадров или ограничения?
Как и в iOS 4.0, вы можете использовать AVCaptureDeviceInput
, чтобы получить камеру в качестве входа устройства и подключить ее к AVCaptureVideoDataOutput
с любым объектом, который вы хотите установить как делегат. Установив формат камеры BGRA 32bpp для камеры, объект-делегат получит каждый кадр из камеры в формате, идеально подходящем для немедленной передачи glTexImage2D
(или glTexSubImage2D
, если устройство не поддерживает не-power-of- две текстуры, я думаю, что устройства MBX попадают в эту категорию).
Существует множество параметров размера кадра и частоты кадров; при угадывании вам придется настроить их в зависимости от того, сколько еще вы хотите использовать GPU. Я обнаружил, что совершенно тривиальная сцена с только текстурированным квадрантом, показывающим последний кадр, который перерисовывается только тогда, когда новый кадр прибывает на iPhone 4, смог отобразить это устройство максимум 720p 24fps без каких-либо заметных задержек. Я не проводил более тщательного бенчмаркинга, поэтому надеюсь, что кто-то еще может посоветовать.
В принципе, для API, фреймы могут возвращаться с некоторым заполнением в памяти между строками сканирования, что означало бы перетасовку содержимого перед отправкой в GL, поэтому вам нужно реализовать для этого путь кода. На практике, говоря чисто эмпирически, кажется, что текущая версия iOS никогда не возвращает изображения в этой форме, поэтому это не проблема производительности.
EDIT: теперь это очень близко к трем годам позже. В промежуточный период 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;Используйте RosyWriter для БОЛЬШЕ лучшего примера того, как делать рендеринг видео в OpenGL. Производительность очень хорошая, особенно если вы уменьшите частоту кадров (~ 10% при 1080P/30, >= 5% при 1080P/15.