o quasi... :-) Nel precedente post ho parlato delle problematiche e possibili soluzioni per mostrare sorgenti video personalizzate in WPF. Ho accennato ad una possibile terza soluzione e sebbene non perfetta la reputo la migliore.
Partiamo dal risultato. Nella figura sottostante potete ammirare un esemplare maschio homo sapiens sapiens:
L'esempio è ottenuto usando come VisualBrush di un cubo 3D, un mio oggetto:
<ricciolo:WebcamElement Source="webcam://WebcamElement/Video%20Camera" />
Questa classe eredita da una classe base AdvancedMediaElement (eredita dalla standard MediaElement) che offre le funzionalità base per supportare qualsiasi grafo DirectShow. Nello specifico, per l'intera applicazione uso una libreria Microsoft di nome detours che permette di sovrascrivere le funzioni Win32 ed eventualmente chiamare la funzione originale. Per il mio scopo intercetto la chiamata a CoCreateInstance, usata per instanziare gli oggetti COM, e quando il MediaElement carica l'URL coercizzo il valore ad un file fisico vuoto creato al volo nella temp dir. Windows Media Player carica DirectShow, crea il grafo e crea l'AsyncReader standard. Io che sono infame, mediante detours, restituisco un mio oggetto che implementa IAsyncReader e non presenta nessun pin. L'intelligent connect passa il nome del file IFileSourceFilter::Load al mio filtro e poi si ferma, mentre quest'ultimo tramite callback notifica all'AdvancedMediaElement di caricare il grafo. Mediante l'associazione URI/istanza chiamo un metodo virtuale OnGraphLoad(IGraphBuilder graph) nella quale le varie implementazioni (nel mio caso WebcamElement) possono popolare il grafo con i fitri che vogliono lavorando via interop con l'ausilio di librerie tipo DirectShowLib.
La soluzione è in parte in C++ CLI, in parte in C#, è aperta ad altre implementazioni e non richiede nessuna registrazione di DLL (le detours sono inglobate nel mio assembly) o di protocol handler. L'unica nota dolente è quel finto file vuoto temporaneo che devo creare per costringere WMP ad usare DirectShow; se qualcune conosce quindi un'alternativa sarò ben contento di ascoltarla.
Presto sorgenti e applicazione di test nel lab
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- WPF e Siverlight: Dispatcher e finestre modali, il 7 aprile 2009 alle 11:43
- Styles Explorer: decompilatore BAML, il 4 aprile 2008 alle 23:57
- Un'occhiata a Silverlight 2.0, il 6 marzo 2008 alle 23:13
- Sorgenti custom per MediaElement di WPF, il 23 gennaio 2008 alle 12:49
- Anonymous type di C# 3.0, il 4 gennaio 2008 alle 14:21