Partiamo dal problema. Il controllo MediaElement (così come il controllo MediaPlayer e DrawingVideo) ha il grosso limite di utilizzare come sorgente video solo una sorgente conosciuta proveniente da un Uri. Per conosciuta si intende una sorgente, il cui protocol handler è registrato nel sistema (client).
Come faccio a riprodurre un flusso video proveniente da una sorgente custom (scheda di acquisizione video, piuttosto che un protocollo di streaming custom) e/o codificato con un codec proprietario?
Cristian, in questo articolo, spiega chiaramente il problema e propone un paio di soluzioni basate su l'interoperabilità tra Win32/WinForm e WPF la prima e la registrazione nel sistema di un custom protocol handler la seconda.
La prima soluzione ha il vantaggio di non richiedere la registrazione di nulla sul sistema client; ha però il grosso svantaggio di non supportare trasformazioni sulla finestra video. I vantaggi e gli svantaggi si ribaltano nella seconda opzione.
Questo post mostra una soluzione brillante che promette di sorpassare entrambi i vincoli.
Per farla breve: questa soluzione utilizza le API WIC per accedere direttamente al buffer unmanaged utilizzato dall'oggetto BitmapSource. Sarebbe già abbastanza per fare buone cose con un po' di Interop e la libreria DirectShowLib.
Per gli intrepidi - coloro che non rabbrividiscono davanti alla necessità di scrivere codice C++ e usare COM - è possibile scrivere un filtro di render in DirectShow, che accetta un riferimento al buffer utilizzato dalla BitmapSource. E' quindi possibile costruire un grafo DirectShow la cui destinazione video è proprio il buffer della BitmapSource esposto a COM dal nostro render. Siamo riusciti a combinare la versatilità di DirectShow con la potenza di WPF. Ma tutto questo - forse - è un'altra storia.