从外部服务流式传输视频

时间:2015-09-01 15:03:56

标签: c# asp.net-web-api stream

我正在开发一个项目(服务器端),我需要将数据(视频,大文件)传输到客户端。

这使用ByteRangeStreamContent完美无缺,因为我从磁盘提供文件并可以创建可搜索的流(FileStream)。

    if (Request.Headers.Range != null)
    {
                try
                {
                        HttpResponseMessage partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent);
                        partialResponse.Content = new ByteRangeStreamContent(fs, Request.Headers.Range, mediaType);
                        return partialResponse;
                }
                catch (InvalidByteRangeException invalidByteRangeException)
                {
                        return Request.CreateErrorResponse(invalidByteRangeException);
                }
     }
     else
     {
                    response.Content = new StreamContent(fs);
                    response.Content.Headers.ContentType = mediaType;
                    return response;
     }

但是,我将文件提供程序从磁盘移动到外部服务。该服务允许我获取数据块(范围{0} - {1})。

当然,不可能在内存中下载整个文件然后使用MemoryStream作为ByteRangeStreamContent,因为显而易见的原因(太多的并发下载会在某些时候消耗所有可用内存)

我发现这篇文章https://vikingerik.wordpress.com/2014/09/28/progressive-download-support-in-asp-net-web-api/,作者说:

  

我为我的图书馆提供的更改请求仅支持阅读   必要的数据并发送出来而不是打开流   完整的数据。在用户之前我不确定这会买什么   他们指出他们正在从WCF流中读取他们的资源数据   这不支持寻求,需要阅读整个流   进入MemoryStream以便允许库生成   输出

     

这个限制仍然存在于这个特定的对象中,但有一个   解决方法。您可以使用而不是使用ByteRangeStreamContent   而是使用ByteArrayContent对象。自大多数   RANGE请求将用于单个开始和结束字节,您可以拉   来自HttpRequestMessage的范围,只检索你的字节   需要并将其作为字节流发送回去。你还需要添加   CONTENT-RANGE标头并将响应代码设置为206   (PartialContent)但这可能是一个可行的选择(尽管我   对于不想要或不能轻易获得的用户,没有测试过   兼容的流对象。

所以,我的问题基本上是:我怎么能这样做?

0 个答案:

没有答案