Visualización de video en vivo desde una fuente de bytes sin comprimir sin procesar en C #: WPF frente a formularios Win

Tengo un flujo de video en vivo en escala de grises de 16 bits que se inserta a través de un buffer de anillo en la memoria como un flujo de bytes sin comprimir (2 bytes por píxel, 2 ^ 18 píxeles por cuadro, 32 cuadros por segundo). (Esto proviene de una cámara de calidad científica, a través de un capturador de fotogramas PCI). Me gustaría hacer un procesamiento simple en el video (rango dinámico del clip, colorear, agregar superposiciones) y luego mostrarlo en una ventana, usando C #.

Estoy trabajando con Windows Forms y GDI (para cada cuadro, construyo un objeto de mapa de bits, escribo valores de píxeles RGB en bruto de 32 bits basados ​​en mis pasos de procesamiento posterior y luego dibuje el cuadro utilizando la clase Gráficos). Pero esto usa una porción significativa de CPU que me gustaría usar para otras cosas. Así que estoy interesado en usar WPF para su pantalla de video acelerada por GPU. (También me gustaría comenzar a usar WPF para sus funciones de enlace y diseño de datos).

Pero nunca he usado WPF antes, así que no estoy seguro de cómo abordar esto. La mayoría de lo que encuentro en línea sobre video y WPF implica leer un archivo de video comprimido del disco (por ejemplo, WMV), o obtener una transmisión de una cámara de nivel de consumidor utilizando una capa de controlador que Windows ya entiende. Así que no parece aplicarse aquí (pero corríjame si me equivoco al respecto).

Entonces, mis preguntas:

¿Existe una forma sencilla, basada en WPF, de reproducir video desde bytes en bruto, sin comprimir, en la memoria (incluso si es solo en escala de grises de 8 bits, o RGB de 24 bits)?

¿Tendré que crear filtros DirectShow (u otros elementos de DirectShow / Media Foundation-ish) para que el procesamiento posterior funcione en la GPU?

Además, se agradecería cualquier consejo / sugerencia general para documentación, ejemplos, blogs, etc. que sean apropiados para estas tareas. ¡Gracias!

Seguir: Después de algunos experimentos, encontréWriteableBitmap para ser lo suficientemente rápido para mis necesidades y extremadamente fácil de usar correctamente: simplemente llameWritePixels() y cualquierImage Los controles vinculados a él se actualizarán a sí mismos.InteropBitmap con las secciones asignadas en memoria es notablemente más rápido, pero tuve que escribir p / invokes a kernel32.dll para usarlo en .NET 3.5.

Respuestas a la pregunta(2)

Su respuesta a la pregunta