2010-05-30 2 views
14

SfondoCome riprodurre un WAV non bufferizzato con l'implementazione MediaStreamSource in Silverlight 4?

sto cercando di trasmettere un file wave in Silverlight 4 utilizzando implementazione MediaStreamSource trovato here. Il problema è che voglio riprodurre il file mentre è ancora in fase di buffering, o quantomeno dare all'utente un feedback visivo mentre è in buffering. Per ora il mio codice è simile che:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(App.Current.Host.Source, "../test.wav")); 
    //request.ContentType = "audio/x-wav"; 
    request.AllowReadStreamBuffering = false; 

    request.BeginGetResponse(new AsyncCallback(RequestCallback), request); 
} 

private void RequestCallback(IAsyncResult ar) 
{ 
    this.Dispatcher.BeginInvoke(delegate() 
    { 
     HttpWebRequest request = (HttpWebRequest)ar.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); 

     WaveMediaStreamSource wavMss = new WaveMediaStreamSource(response.GetResponseStream()); 

     try 
     { 
      me.SetSource(wavMss); 
     } 
     catch (InvalidOperationException) 
     { 
      // This file is not valid 
     } 
     me.Play(); 
    }); 
} 

Il problema è che dopo aver impostato request.AllowReadStreamBuffering = false il flusso non supporta ricerca e l'attuazione di cui sopra genera un'eccezione (tenere a mente ho messo un po 'della logica di impostazione della posizione in if (stream.CanSeek) blocco):

Leggi non è supportata sul thread principale quando il buffer è disattivato

domanda

C'è un modo per riprodurre stream WAV senza il buffering in anticipo in Silverlight 4?

risposta

3

Scaricare un flusso mentre lo leggi non funzionerà perché la lettura dello steram per la riproduzione sposterà la proprietà Position nello stream e quando si scriveranno i dati nello stream, la posizione non sarà nella posizione corretta . questo è fondamentalmente il motivo per cui non puoi cercare nel tuo stream.

Quello che ho fatto per risolvere il problema esatto era quello di creare un flusso di memoria personalizzato (ReadWriteMemoryStream) che sarebbe incorporare la logica per la lettura/scrittura in modo da poter scaricare il file da un lato, aggiungerlo al ReadWriteMemoryStream e basare la mia MediaStreamSource su questo ReadWriteMemoryStream invece del flusso di rete.

Potete trovare il mio attuazione della presente ReadWriteMemoryStream qui:

https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs

è anche possibile controllare il resto del progetto, al fine di dare un'occhiata al suo utilizzo se non siete sicuri su di esso.

Spero che questo aiuti.