2012-09-10 22 views
13

Quiero transmitir datos desde un servidor a un MediaElement en mi aplicación Windows 8 Store (anteriormente Metro). Sin embargo, necesito "grabar" la transmisión mientras se está transmitiendo, por lo que se puede enviar desde la memoria caché si se vuelve a solicitar, por lo que no quiero ingresar la URL directamente en el MediaElement.Streaming con intermediario en Windows 8

En la actualidad, el principal escollo es que MediaElement.SetSource() acepta una IRandomAccessStream, no un System.IO.Stream, que es lo que recibo de HttpWebResponse.GetResponseStream().

El código que tengo ahora, lo que no funciona:

var request = WebRequest.CreateHttp(url); 
request.AllowReadStreamBuffering = false; 
request.BeginGetResponse(ar => 
       { 
        var response = ((HttpWebResponse)request.EndGetResponse(ar)); 
        // this is System.IO.Stream: 
        var stream = response.GetResponseStream(); 
        // this needs IRandomAccessStream: 
        MediaPlayer.SetSource(stream, "audio/mp3"); 
       }, null); 

¿Existe una solución que me permite transmitir audio, pero permite que copie la corriente en el disco cuando se ha terminado de leer desde el control remoto ¿lado?

+0

has dado cuenta? de hecho, no necesito almacenarlo, solo quiero transmitirlo directamente. – esskar

+0

@esskar No realmente. La transmisión directa funciona de maravilla simplemente proporcionando la URL, o un 'InMemoryRandomAccessStream'. El problema es distribuir la transmisión a dos ubicaciones diferentes. –

+0

gracias por la información. Intenté establecer la propiedad '.Source' directamente, pero no funcionó para mí. (Obtengo excepciones de null-ref en algún lugar de las profundidades), y no he descubierto cómo crear un 'IRandomAccessStream' para formar una URL. pero trabajaré en eso hoy. – esskar

Respuesta

0

No he experimentado con la siguiente idea, pero podría funcionar: podría comenzar a transmitir los datos web en un archivo y luego, después de unos segundos (para el almacenamiento en búfer), pasar ese archivo a MediaElement.

Me di cuenta de que MediaElement puede ser exigente con la apertura de un archivo en el que se está escribiendo, pero lo he visto funcionar. Sin embargo, no puedo decir por qué a veces funciona y por qué a veces no funciona.

0

supongo que esto ayudaría a convertir la corriente a IRandomAccessStream

InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream(); 

using (Stream stream = response.GetResponseStream();) 
    { 
    await stream.CopyToAsync(ras.AsStreamForWrite()); 
    }