IOS: видео как текстура GL с альфа-прозрачностью

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

Информация о видео как текстура GL здесь: Возможно ли использовать видео как текстуру для GL в iOS? и iOS4: как использовать видеофайл в качестве текстуры OpenGL?.

Использование ffmpeg для помощи с альфа-прозрачностью, но не для удобного хранилища приложений: iPhone: отобразить полупрозрачное видео поверх UIView?

Источник видео будет снят перед зеленым экраном для обработки цветности. Видео может быть нетронутым, чтобы оставить зеленый экран или обработать в комплекте для редактирования видео и экспортироваться в Quicktime Animation или Apple Pro Res 4444 с Alpha.

Есть несколько подходов, которые, я думаю, потенциально могут работать, но я не нашел полного решения.

  • Обработка порогового значения в реальном времени видео, которое ищет зеленый, чтобы удалить.
  • Узнайте, как использовать вышеупомянутые кодеки Quicktime для сохранения альфа-канала
  • Смешивание двух видео вместе: 1) Основное видео с RGB 2) отдельное видео с альфа-маской

Я хотел бы рассказать о наилучшем подходе к iOS и OpenGL ES 2.0

Спасибо.

Ответ 1

Самый простой способ сделать цветную синхронизацию для простого смешивания фильма и другой сцены - использовать GPUImageChromaKeyBlendFilter из GPUImage, Вы можете предоставить источник фильма как GPUImageMovie, а затем смешать это с фоновым контентом. Фильтр ключевых цветов позволяет указать цвет, близость к этому цвету и плавность смешивания для использования в операции замены. Все это ускоряет GPU с помощью настроенных шейдеров.

Изображения, фильмы и живые камеры могут использоваться в качестве источников, но если вы хотите отобразить это с содержимым OpenGL ES за своим видеороликом, я бы рекомендовал визуализировать ваш контент OpenGL ES на FBO с поддержкой текстуры и передать это текстуры через GPUImageTextureInput.

Вы можете использовать это, чтобы вывести текстуру, содержащую ваши кадры фильма, с измененным цветом, замененным постоянным цветом с альфа-каналом 0. Эта текстура может быть извлечена с использованием GPUImageTextureOutput для последующего использования в вашей сцене OpenGL ES.

Ответ 2

Apple показала пример приложения на WWDC в 2011 году под названием ChromaKey, в котором показано, как обрабатывать кадры видео, передаваемые текстуре OpenGL, обрабатываться и, возможно, записываться в видеофайл.

(Очень эффектно)

Он написан для использования фида с видеокамеры и использует очень грубый алгоритм хромки.

Как сказал другой плакат, вы, вероятно, захотите пропустить код chromakey и сделать предварительный вырез цвета заранее.

Не следует переписывать пример приложения Chromakey для использования видеофайла в качестве входного сигнала вместо подачи камеры, и довольно легко отключить код chormakey.

Вам нужно будет изменить настройку видеовхода, чтобы ожидать RGBA-данных вместо RGB или Y/UV. Пример приложения настроен на использование RGB, но я видел другие примеры приложений от Apple, которые используют Y/UV вместо этого.

Ответ 3

Посмотрите бесплатное приложение APNG в магазине приложений. Он показывает, как анимационный PNG (.apng) можно отобразить непосредственно на iOS-представлении. Ключевым моментом является то, что APNG поддерживает альфа-канал в формате файла, поэтому вам не нужно возиться с трюками цвета, которые не будут действительно работать для всего вашего видеоконтента. Этот подход более эффективен, когда несколько слоев или цветовых трюков, так как другой раунд обработки не требуется каждый раз, когда текстура отображается в цикле.

Если вы хотите взглянуть на небольшой пример проекта xcode, который отображает анимацию альфа-канала на стороне вращающегося куба с OpenGL ES2, его можно найти в Загрузите текстуры OpenGL с альфа-каналом в iOS. Код примера показывает простой вызов glTexImage2D(), который загружает текстуру на графическую карту один раз для каждого обратного вызова на экране.