2010-05-30 8 views
14

Antecedentes¿Cómo se juega WAV sin buffer con la implementación de MediaStreamSource en Silverlight 4?

que estoy tratando de transmitir un archivo de onda en Silverlight 4 usando la aplicación MediaStreamSource encontró here. El problema es que quiero reproducir el archivo mientras aún está almacenado en el búfer, o al menos darle al usuario algunos comentarios visuales mientras se está almacenando en el búfer. Por ahora mi código es el que:

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(); 
    }); 
} 

El problema es que después de ajustar request.AllowReadStreamBuffering = false la corriente no es compatible con la búsqueda y la aplicación mencionada anteriormente se produce una excepción (tenga en cuenta que he puesto algo de la lógica de ajuste de la posición if (stream.CanSeek) en bloque):

Leer no es compatible con el hilo principal cuando el búfer está desactivado

pregunta

¿Hay alguna manera de reproducir la secuencia WAV sin almacenarla de antemano en Silverlight 4?

Respuesta

3

descarga de una corriente mientras se lee que no va a funcionar porque la lectura de la steram para la reproducción se moverá la propiedad de posición dentro de la corriente, y cuando se va a escribir datos en la corriente, la posición no estará en la posición correcta . eso es básicamente por qué no puedes buscar en tu transmisión.

Lo que hice para resolver ese problema exacto fue crear una secuencia de memoria personalizada (ReadWriteMemoryStream) que incorporaría la lógica de lectura/escritura para poder descargar el archivo en un extremo, agregarlo al ReadWriteMemoryStream y basar mi MediaStreamSource en este ReadWriteMemoryStream en lugar de la transmisión de red.

Puede encontrar mi aplicación de esta ReadWriteMemoryStream aquí:

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

También puede comprobar el resto del proyecto con el fin de echar un vistazo a su uso si no está seguro de ello.

Espero que esto ayude.

Cuestiones relacionadas