在Windows 8中使用go-between进行流媒体传输

28

我想在我的Windows 8 Store应用程序中将数据从服务器流式传输到MediaElement。但是,在流式传输时,我需要“记录”该流以便在重新请求时可以从缓存中提供,因此我不希望直接将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);

有没有一个解决方案可以让我流式传输音频,但在从远程端读取完毕后允许我将流复制到磁盘上?


你搞定了吗?其实我不需要存储它,我只想直接流传。 - esskar
@esskar 不完全是这样。只需提供URL或InMemoryRandomAccessStream,直接流式传输非常好。问题在于将流分发到两个不同的位置。 - Vegard Larsen
感谢提供的信息。我尝试直接设置.Source属性,但是它没有生效(我在代码深处得到一个空引用异常),而且我还没有弄清如何从URL创建IRandomAccessStream。但我会今天继续努力。 - esskar
你不需要一个 IRandomAccessStream,只需设置 me.Source = new Uri("http://..."); 就可以了... - Vegard Larsen
2个回答

0

我想这会帮助你将Stream转换为IRandomAccessStream

InMemoryRandomAccessStream  ras = new InMemoryRandomAccessStream();

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

0

我还没有尝试过以下的想法,但它可能有效:您可以开始将Web数据流式传输到文件中,然后在几秒钟后(用于缓冲),将该文件传递给MediaElement。

我注意到MediaElement在打开正在写入的文件时可能会挑剔,但我已经看到它起作用。虽然我不能说为什么有时候它能工作,有时候它不能工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接