Подтвердить что ты не робот

Потоковая передача с помощью Windows 8

Я хочу передать данные с сервера в MediaElement в моем приложении Windows 8 Store (ранее Metro). Тем не менее, мне нужно "записывать" поток во время его потоковой передачи, поэтому его можно обслуживать из кеша, если он запрашивается повторно, поэтому я не хочу напрямую направлять URL-адрес в MediaElement.

В настоящее время камнем преткновения является то, что MediaElement.SetSource() принимает IRandomAccessStream, а не System.IO.Stream, что я получаю от HttpWebResponse.GetResponseStream().

Код, который у меня есть сейчас, который не работает:

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

Есть ли решение, которое позволяет мне передавать аудио, но позволяет мне копировать поток на диск, когда он закончил чтение с удаленной стороны?

4b9b3361

Ответ 1

Я не экспериментировал со следующей идеей, но это может сработать: вы можете начать передачу веб-данных в файл, а затем через несколько секунд (для буферизации) передать этот файл в MediaElement.

Я заметил, что MediaElement может быть придирчивым к открытию файла, который записывается, но я видел, как он работает. Хотя, я не могу сказать, почему это иногда работает и почему это иногда не делает.

Ответ 2

Я думаю, это поможет вам конвертировать Stream в IRandomAccessStream

InMemoryRandomAccessStream  ras = new InMemoryRandomAccessStream();

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