Возможно ли использовать видео в качестве текстуры для GL в iOS? - PullRequest
11 голосов
/ 21 ноября 2010

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

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

Ответы [ 2 ]

19 голосов
/ 22 ноября 2010

Начиная с 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. К сожалению, положения и условия не допускают дублирования кода здесь без прикрепления всего проекта, но пошаговая настройка:

  1. создать CVOpenGLESTextureCacheCreate и AVCaptureSession;
  2. захватить подходящий AVCaptureDevice для видео;
  3. создать AVCaptureDeviceInput с этим устройством захвата;
  4. присоедините AVCaptureVideoDataOutput и скажите, чтобы он вызывал вас в качестве примера делегата буфера.

После получения каждого буфера для образцов:

  1. получить CVImageBufferRef от него;
  2. используйте CVOpenGLESTextureCacheCreateTextureFromImage для получения Y и UV CVOpenGLESTextureRef с из буфера CV-изображений;
  3. получить текстурные цели и имена из текстурных ссылок CV OpenGLES, чтобы связать их;
  4. объединяет яркость и цветность в вашем шейдере.
0 голосов
/ 06 апреля 2015

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

...