在 Windows 8 中使用中间人进行流式处理

Streaming with go-between in Windows 8

提问人:Vegard Larsen 提问时间:9/10/2012 最后编辑:Vegard Larsen 更新时间:5/2/2023 访问量:1182

问:

我想将数据从服务器流式传输到我的 Windows 8 应用商店(以前称为 Metro)应用中。但是,我需要在流式传输时“记录”流,以便在重新请求时可以从缓存中提供它,因此我不想将 URL 直接馈送到 .MediaElementMediaElement

目前,绊脚石是接受一个 ,而不是一个 ,这是我从中得到的。MediaElement.SetSource()IRandomAccessStreamSystem.IO.StreamHttpWebResponse.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);

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

C# httpwebrequest Windows-8 microsoft-metro

评论

0赞 esskar 10/19/2012
你想通了吗?实际上我不需要存储它,我只想直接流式传输它。
0赞 Vegard Larsen 10/19/2012
@esskar 不是的。只需提供 URL 或 .问题在于将流分发到两个不同的位置。InMemoryRandomAccessStream
0赞 esskar 10/19/2012
谢谢你的信息。我试图直接设置属性,但它对我不起作用。(我在深处的某个地方得到了一个 null-ref 异常),我还没有弄清楚如何创建一个表单 URL。但我今天会努力。.SourceIRandomAccessStream
0赞 Vegard Larsen 10/19/2012
你不需要一个,只需设置,它应该可以工作......IRandomAccessStreamme.Source = new Uri("http://...");

答:

0赞 Pierre Henri K 10/8/2012 #1

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

我注意到 MediaElement 在打开正在写入的文件时可能会很挑剔,但我已经看到它工作了。不过,我不能说为什么它有时有效,为什么有时无效。

0赞 Aman Chaudhary 3/20/2015 #2

我想这将帮助您将 Stream 转换为 IRandomAccessStream

InMemoryRandomAccessStream  ras = new InMemoryRandomAccessStream();

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