Потоковая передача с помощью 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);
Есть ли решение, которое позволяет мне передавать аудио, но позволяет мне копировать поток на диск, когда он закончил чтение с удаленной стороны?
Ответы
Ответ 1
Я не экспериментировал со следующей идеей, но это может сработать: вы можете начать передачу веб-данных в файл, а затем через несколько секунд (для буферизации) передать этот файл в MediaElement.
Я заметил, что MediaElement может быть придирчивым к открытию файла, который записывается, но я видел, как он работает. Хотя, я не могу сказать, почему это иногда работает и почему это иногда не делает.
Ответ 2
Я думаю, это поможет вам конвертировать Stream в IRandomAccessStream
InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
using (Stream stream = response.GetResponseStream();)
{
await stream.CopyToAsync(ras.AsStreamForWrite());
}