2011-08-19 20 views

risposta

6

SE è possibile impostare WCF per la consegna dell'oggetto multimediale tramite http-URL (GET), quindi è sufficiente assegnare tale URL alla proprietà MediaElement.Source - vedere http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.source.aspx.

Per i casi in cui tale URL non è disponibile/possibile:

Assegnazione di uno Stream non è attualmente possibile - anche se ci sono alcuni hack per realizzare questo obiettivo, per esempio a base di DirectShow vedere http://social.msdn.microsoft.com/forums/en-US/wpf/thread/6191ef1a-0010-4294-a5b4-451bbadca33a/ e http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/15/WPF-Hackery-Part-I.aspx.

Un'altra opzione sarebbe quella di ospitare in qualche modo la Silverlight MediaElement e utilizzare il metodo SetSource che può richiedere un ruscello e giocare ... vedi http://silverlightviewport.codeplex.com/SourceControl/list/changesets e http://msdn.microsoft.com/en-us/library/cc190669%28v=vs.95%29.aspx

4

So che questo non è quello che hai chiesto, ma si può ospitare un componente ActiveX VLC all'interno di una finestra in WPF e quindi utilizzare quel controllo VLC per connettersi allo stream e visualizzare lo stream. Questo è il modo in cui ho ottenuto lo streaming lavorando attraverso WPF.

Edit: this page has an example of how to host an ActiveX control inside WPF

+2

Posso vedere un esempio di un'applicazione WPF che esegue VLC come componente ActiveX? Mi piacerebbe vedere che aspetto ha e cosa è implicato nel farla funzionare prima ancora di farlo. – rafale

+0

Ciao Stuart, potresti pubblicare il tuo esempio usando VLC da qualche parte in modo che io possa dare un'occhiata. Grazie. –

12

Prima che qualcuno spreca ore trovare questo fuori da sé: non è possibile ospitare il Silverlight MediaElement in un'applicazione WPF. La ragione di ciò è che si tratta di un numero di tipi visualizzati in PresentationFramework.dll (inevitabile per WPF) e System.Windows.dll (versioni di Silverlight) che hanno gli stessi nomi e gli stessi spazi dei nomi, ma sono di tipi diversi. (Qualcuno dovrebbe spiegare perché abbiamo namespace su microsoft!)

+1

Questo è vero. Purtroppo ho dovuto scoprirlo nel modo più duro. :( – rafale

+4

So che questa è una risposta di un anno, ma non sono "più tipi distinti con lo stesso nome nello stesso spazio dei nomi" la ragione per cui esistono alias di riferimento? –

+1

È sempre possibile creare un sito Web Silverlight e utilizzare MediaElement lì e in WPF applicatione aggiungere il controllo WebBrowser con il sorgente a quel sito Web di Silverlight ed è fatto. –

12

Potrebbe essere troppo tardi, si spera che questo possa essere d'aiuto se stai ancora cercando una risposta.

Sì, è possibile riprodurre video da un flusso di memoria utilizzando l'elemento multimediale WPF.

ho usato un componente di terze parti chiamato boxed app, Un milione di grazie a BoxedApp - http://www.boxedapp.com/boxedappsdk/

devo aggiornare il codice un po 'piccolo per farlo funzionare per byte []. Copia il costruttore di seguito per classe CustomFileStream da BoxedApp

public CustomFileStream(byte[] data) 
{ 
    _Stream = new MemoryStream(data); 
    _Length = _Stream.Length; 
    _data = data; 
    _Offset = 0; 
} 

Creare un'applicazione WPF e aggiungere un elemento di supporto e un pulsante e copiare il codice qui sotto

public MainWindow() 
{ 
    BoxedAppSDK.NativeMethods.BoxedAppSDK_Init(); 

    InitializeComponent(); 
} 

private void button2_Click(object sender, RoutedEventArgs e) 
{ 
    var MyFileStream = new CustomFileStream(File.ReadAllBytes(@"wildlife.wmv")); 

    IntPtr ptr = BoxedAppSDK.NativeMethods.BoxedAppSDK_CreateVirtualFileBasedOnIStream(
      @"1.wmv", 
      BoxedAppSDK.NativeMethods.EFileAccess.GenericWrite, 
      BoxedAppSDK.NativeMethods.EFileShare.Read, 
      IntPtr.Zero, 
      BoxedAppSDK.NativeMethods.ECreationDisposition.New, 
      BoxedAppSDK.NativeMethods.EFileAttributes.Normal, 
      IntPtr.Zero, 
      MyFileStream); 

    using (new SafeFileHandle(ptr, true)) 
    { 
     mediaElement1.Source = new Uri(Path.GetFullPath("1.wmv")); 
     mediaElement1.LoadedBehavior = MediaState.Manual; 
     mediaElement1.Play(); 
    } 
} 

- per applicazione in scatola si prega di seguire i campioni e questo è è .. sei in un mondo felice ...

È la stessa cosa anche per QT Player.

In base alla risposta, aggiungerò un esempio completo se le informazioni fornite non sono sufficienti. codifica ....

Felice

+0

Ottima risposta, grazie mille! – Mafii

0

Come WPF MediaElement utilizza internamente windows media player. Se si modificano le impostazioni del buffer del lettore multimediale dall'impostazione del buffer predefinito su personalizzato. Apri Windows Media Player  Strumenti  Opzioni  Prestazioni.

Quando si seleziona l'opzione "Buffer" e si imposta "Seconds of content" su 2. I seguenti valori di registro verranno aggiunti sotto il lettore multimediale. HKEY_CURRENT_USER \ Software \ Microsoft \ MediaPlayer \ Preferences UseDefaultBufferTime = 0 CustomBufferTime = 2000

È possibile utilizzare classe registro dotnet per apportare modifiche. Vedere questo link: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1b4b8fb9-ff8f-4861-8e99-4a7a4fc75596/setting-windows-media-player-properties-in-wpf?forum=wpf#ac879a7f-37bc-4ccc-854d-ab6e047086e5

Problemi correlati