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

Можно ли использовать видео как текстуру для GL в iOS?

Возможно ли использовать видео (предварительно рендеринг, сжатый с H.264) в качестве текстуры для GL в iOS?

Если возможно, как это сделать? И любое качество воспроизведения/частота кадров или ограничения?

4b9b3361

Ответ 1

Как и в 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;
  • получить текстурные цели и имена из текстурных ссылок CV OpenGLES для их привязки;
  • объединить яркость и цветность в вашем шейдере.

Ответ 2

Используйте RosyWriter для БОЛЬШЕ лучшего примера того, как делать рендеринг видео в OpenGL. Производительность очень хорошая, особенно если вы уменьшите частоту кадров (~ 10% при 1080P/30, >= 5% при 1080P/15.