2009-10-07 6 views
4

I ont un réel flux vidéo d'échelle de gris de 16 bits qui est poussé à travers une bague-tampon dans la mémoire comme un flux d'octets brut, non compressé (2 octets par pixel, 2^18 pixels/image, 32 images/s). (Cela vient d'un appareil photo de qualité scientifique, via un PCI-grabber). Je voudrais faire un traitement simple sur la vidéo (plage dynamique du clip, coloriser, ajouter des superpositions) et ensuite le montrer dans une fenêtre, en utilisant C#. J'ai ce travail en utilisant Windows Forms & GDI (pour chaque image, construisez un objet Bitmap, écrivez des valeurs de pixel RVB 32 bits brutes basées sur mes étapes de post-traitement, puis dessinez le cadre en utilisant la classe Graphics). Mais cela utilise un morceau important de CPU que je voudrais utiliser pour d'autres choses. Je suis donc intéressé par l'utilisation de WPF pour son affichage vidéo accéléré par GPU. (Je voudrais aussi commencer à utiliser WPF pour ses liaisons de données & caractéristiques de mise en page.)Affichage vidéo en direct à partir d'une source d'octet non comprimé cru en C#: WPF vs Win forme

Mais je ne l'ai jamais utilisé WPF avant, donc je ne suis pas sûr comment aborder ce sujet. La plupart de ce que je trouve en ligne sur la vidéo & WPF consiste à lire un fichier vidéo compressé à partir du disque (par exemple WMV), ou d'obtenir un flux à partir d'un appareil de consommation de qualité en utilisant une couche de pilote que Windows comprend déjà. Cela ne semble donc pas s'appliquer ici (mais corrigez-moi si je me trompe à ce sujet).

Alors, mes questions:

  • Est-il un moyen basé WPF-straighforward, pour lire la vidéo à partir octets bruts, non compressés en mémoire (même si seulement en niveaux de gris 8 bits ou RVB 24 bits)? Aurai-je besoin de créer des filtres DirectShow (ou d'autres éléments DirectShow/Media Foundation) pour que le post-traitement fonctionne sur le GPU?

De même, des conseils/suggestions d'ordre général pour la documentation, les exemples, les blogs, etc. qui sont appropriés à ces tâches seraient appréciés. Merci!


Suivi: Après quelques essais, j'ai trouvé WriteableBitmap être assez rapide pour mes besoins, et extrêmement facile à utiliser correctement: il suffit d'appeler WritePixels() et tout à lui lié les contrôles Image vont se mettre à jour. InteropBitmap avec des sections mappées en mémoire est sensiblement plus rapide, mais j'ai dû écrire p/invokes à kernel32.dll pour l'utiliser sur .NET 3.5.

Répondre

1

Mon VideoRendererElement, bien que très efficace, n'utiliser un peu pour le faire carriole fonctionner. Vous pouvez également essayer le WriteableBitmap dans .NET 3.5 SP1.

De plus, le InteropBitmap est très rapide aussi. Beaucoup plus efficace que le WB car il n'est pas à double tampon. Bien qu'il puisse être sujet à la déchirure vidéo.

+0

Vous devriez avoir correctement lié à la ressource hors site – Kris