¿Cómo renderizar y procesar eficientemente transmisiones de video usando GPU?

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Planeo desarrollar una herramienta para la manipulación de video en tiempo real usando C ++, Qt y OpenGL. La superposición de video no es una opción, ya que los sombreadores deben usarse para el procesamiento de cuadros. Por el momento imagino una secuencia de pasos a continuación:

  1. Decodificar video (CPU)
  2. Preprocesarlo (opcional, CPU)
  3. Transfiéralo a la memoria de video (GPU usando DMA)
  4. Seguir procesándolo con sombreadores de vértices y fragmentos (GPU)
  5. Renderizarlo (GPU)

Estoy buscando un consejo general que explique qué extensiones o técnicas se pueden usar aquí. ¿Hay alguna buena razón para usar Direct3D en su lugar?

¿Fue útil?

Solución

Primero, en la PC no hay una forma explícita de usar DMA. El controlador podría usarlo, o podría usar otra cosa.

En cualquier caso, el paso 3 será & "; cambiar los datos de textura en la tarjeta gráfica &"; En OpenGL, esa es la extensión PBO (Pixel Buffer Object) o la buena función glTexSubImage *. En D3D9 es LockRect en la textura u otras formas (por ejemplo, LockRect en una textura de cero, luego se convierte en una textura de GPU). Cualquiera de ellos podría utilizar DMA, pero no puede estar seguro.

Entonces los datos están en una textura. Puede renderizarlo en una pantalla con algunos sombreadores (por ejemplo, haciendo la conversión YCbCr), o renderizar en otras texturas para hacer efectos de procesamiento más complejos (por ejemplo, desenfoque / brillo / ...).

Usar Direct3D es más fácil en el sentido de que hay " wast way " de hacer cosas En OpenGL hay muchas más opciones para hacer cualquier cosa, y de alguna manera tienes que descubrir cuáles son rápidas (a veces las rutas rápidas son diferentes en diferentes plataformas o hardware).

Otros consejos

Si usted es Linux, los controladores recientes de NVIDIA en la serie 180.xx han agregado soporte para la decodificación de video a través de la api VDPAU (decodificación de video y presentación). Muchos proyectos importantes se han integrado con la API, incluidos mplayer, vlc, ffmpeg y mythtv. No conozco todos los detalles, pero proporcionan una API para muchos códecs, incluidas suboperaciones comunes y manipulación de flujo de bits.

Me gustaría mirar aquí antes de ir directamente a CUDA (que supongo que VDPAU puede usar)

Para transferir los datos del marco de la CPU a la GPU, es posible que desee consultar PBO s. Compruebe esto también.

Además, si está utilizando sombreadores de todos modos, podría aliviar la carga de la CPU haciendo transformaciones de espacio de color en los sombreadores de fragmentos (YCbCr a RGB).

El " procesamiento adicional " y " renderizado " los pasos generalmente son más o menos lo mismo, haz cosas geniales en sombreadores y mézclalos con framebuffer. Si desea mezclar y combinar videos y diferentes efectos, FBO s son útiles también.

Como alternativa, puede ver algunos de los diferentes idiomas para realizar la programación de GPU de propósito general (GPGPU) como CUDA de NVIDIA o Stream SDK de ATI. Sin embargo, según el que elija, puede limitarse a una marca de GPU. La razón para usar estos lenguajes sería trabajar a un nivel de abstracción más cercano a la programación normal de alto nivel en lugar de trabajar con sombreadores.

No tengo experiencia con lo que quieres hacer, así que no puedo decir si los sombreadores son realmente más adecuados para el trabajo, pero es algo que puedes considerar mirar. Hay que decir que el diseño del algoritmo sigue siendo algo diferente al código ordinario y requiere un poco de esfuerzo dominarlo (solo he trabajado con CUDA pero todos parecen usar abstracciones similares).

Supongo que si tienes una buena cantidad de experiencia con el trabajo de sombreado, puede que no valga la pena aprender una nueva plataforma.

Los siguientes pasos deberían hacerlo:

  1. decodifica video a YUV

    Esto suele ser lo que hacen las bibliotecas de decodificadores.

  2. Cargar en OpenGL como una textura

  3. convertir YUV a RGB

    Dado que no desea utilizar una superposición, debe realizar la conversión manualmente. Aquí es un ejemplo usando sombreadores.

  4. coloca la textura convertida en un quad y renderiza a la pantalla

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top