Как эффективно визуализировать и обрабатывать видеопотоки с помощью графического процессора?

StackOverflow https://stackoverflow.com/questions/480460

  •  20-08-2019
  •  | 
  •  

Вопрос

Я планирую разработать инструмент для манипулирования видео в реальном времени с использованием C ++, Qt и OpenGL.Наложение видео не является вариантом, поскольку для обработки кадров следует использовать шейдеры.На данный момент я представляю себе следующую последовательность шагов:

  1. Декодирование видео (процессор)
  2. Предварительная обработка (необязательно, центральный процессор)
  3. Перенесите его в видеопамять (графический процессор, использующий DMA).
  4. Дальнейшая обработка с использованием вершинного и фрагментарного шейдеров (GPU)
  5. Визуализировать его (графический процессор)

Я ищу несколько общих советов, объясняющих, какие расширения или техники здесь можно использовать.Есть ли веская причина использовать Direct3D вместо этого?

Это было полезно?

Решение

Во-первых, на ПК нет явного способа использования DMA.Водитель мощь используйте его или можете использовать что-то еще.

В любом случае, шагом 3 будет «изменить данные текстуры на видеокарте».В OpenGL это расширение PBO (Pixel Buffer Object) или старая добрая функция glTexSubImage*.В D3D9 это LockRect на текстуре или другие способы (например.LockRect на скретч-текстуре, а затем преобразование в текстуру графического процессора).Любой из них потенциально может использовать DMA, но вы не можете быть уверены.

Затем данные находятся в текстуре.Вы можете визуализировать его на экране с помощью некоторых шейдеров (например.выполнение преобразования YCbCr) или рендеринг в другие текстуры для выполнения более сложных эффектов обработки (например,размытие/свечение/...).

Использование Direct3D проще в том смысле, что существуют четко определенные «ненужные способы» выполнения действий.В OpenGL гораздо больше возможностей сделать что угодно, и вам нужно как-то разобраться, какие из них быстрые (иногда быстрые пути различаются на разных платформах или оборудовании).

Другие советы

Если вы используете Linux, последние версии драйверов NVIDIA серии 180.xx добавили поддержку декодирования видео через VDPAU api (Video Decoding and Presentation something).Многие крупные проекты интегрировались с API, включая mplayer, vlc, ffmpeg и mythtv.Я не знаю всех подробностей, но они предоставляют API для многих кодеков, включая общие подоперации и манипулирование потоком битов.

Я бы посмотрел здесь, прежде чем переходить сразу к CUDA (который, я предполагаю, может использовать VDPAU)

Для передачи данных кадра с процессора на графический процессор вы можете заглянуть в ПБОс.Проверять этот также.

Кроме того, если вы все равно используете шейдеры, вы можете облегчить нагрузку на процессор, выполнив преобразования цветового пространства во фрагментных шейдерах (YCbCr в RGB).

Этапы «дальнейшей обработки» и «рендеринга» обычно практически одинаковы: делают крутые вещи в шейдерах и смешивают их с фреймбуфером.Если вы хотите смешивать и сочетать видео и различные эффекты, ФБОэто тоже полезно.

В качестве альтернативы вы можете рассмотреть некоторые различные языки для выполнения программирования графических процессоров общего назначения (GPGPU), такие как CUDA от NVIDIA или Stream SDK от ATI.Однако в зависимости от того, что вы выберете, вы можете ограничиться одной маркой графических процессоров.Причиной использования этих языков может быть работа на уровне абстракции, который ближе к обычному программированию высокого уровня, а не к работе с шейдерами.

У меня нет опыта в том, что вы хотите сделать, поэтому я не могу сказать, действительно ли шейдеры лучше подходят для этой работы, но вы можете подумать об этом.Надо сказать, что разработка алгоритма все же несколько отличается от обычного кода, и чтобы его освоить, нужно приложить некоторые усилия (я работал только с CUDA, но все они, похоже, используют схожие абстракции).

Я полагаю, что если у вас есть приличный опыт работы с шейдерами, возможно, вам не стоит тратить силы на изучение новой платформы.

Следующие шаги должны сделать это:

  1. декодировать видео в YUV

    Обычно это то, что делают библиотеки декодера.

  2. Загрузите в OpenGL как текстуру.

  3. конвертировать YUV в RGB

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

  4. поместить преобразованную текстуру в квадрат и отобразить на экране

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top