2011-08-21 90 views
9

Ho scritto un servizio WCF che esegue lo streaming di file multimediali. Sto scrivendo ora un'applicazione WPF che consuma questo servizio e ho appena scoperto che MediaElement non accetta gli oggetti Stream come parametri di input per la proprietà source.Riproduzione di video in streaming in WPF

Sono stato su Google incessantemente negli ultimi due giorni e ho esaminato diverse alternative tra cui Silverlight Viewports all'interno di WPF, controlli ActiveX VLC, VideoRendererElement e WPFMediaKit. Sfortunatamente sono stato ostacolato dalla mancanza di documentazione e/o esempi e finora non ho fatto progressi. Il fatto che sia la prima volta che utilizzo WPF non aiuta neanche.

Per dirla in parole semplici, quello che sto cercando è qualcosa che viene fornito con la documentazione o esempi che dimostrano lo streaming in WPF e, se possibile, è anche semplice da implementare. La soluzione non deve essere perfetta; tutto ciò di cui ho bisogno è qualcosa che funzioni.

risposta

5

È possibile ospitare un HttpListener all'interno dell'app WPF e fornire lo stream che si riceve dal servizio WCF tramite un URL servito da HttpListener a MediaElement.Source.

Altre opzioni (anche se ti sembra di averli escluso):

Non sono sicuro se questa è un'opzione per voi, ma ci sono librerie commerciali per i contenuti multimediali inclusa la riproduzione di video da flussi in WPF:

+0

Il servizio WCF utilizza binding TCP, e viene eseguito all'esterno di un IIS come servizio Windows gestito. Sarei in grado di utilizzare TcpListener anziché HttpListener per ottenere in qualche modo l'URL del flusso in ingresso? – rafale

+0

Suppongo che il tuo servizio WCF restituisca un IStream - SE questa ipotesi è vera, dovresti semplicemente usare la classe del proxy WCF per ottenere lo Stream e quindi fornire quel flusso alle librerie che ho menzionato e "inoltrarlo" a un URL http all'interno della tua app con HttpListener e dire a MediaElement di usare quell'URL http ... ti consiglio caldamente di usare una delle librerie però ... – Yahia

+0

Non ho mai usato la classe HttpListener prima, quindi non capisco come farei inoltra un flusso a un URL HTTP. È ciò che intendi? http://pastebin.com/iELVyybp – rafale

0

C'è un modo per raggiungere questo obiettivo utilizzando un pseudofiles, vale a dire l'emulazione delle chiamate di sistema di file.

Quando passa un percorso, un lettore multimediale apre il file (viene chiamato CreateFile), quindi legge i dati da esso (viene chiamato ReadFile), sposta la posizione all'interno del file (viene chiamato SetFilePointer).

Si sposta semplicemente all'interno del file video e legge i blocchi richiesti.

Per esempio qui descritto questo approccio (file chiamate solo mappato adeguati metodi IStream: ReadFile -> Leggi, SetFilePointer -> Seek, CreateFile -> Clone ecc): http://boxedapp.com/encrypted_video_streaming.html