【问题标题】:.NET Core 2.0 Web API for Video Streaming from FileStream.NET Core 2.0 Web API,用于从 FileStream 流式传输视频
【发布时间】:2018-04-02 21:05:12
【问题描述】:

我发现了一堆示例,这些示例使用了我的应用程序中不可用的对象,并且似乎与我的 .NET Core Web API 版本不匹配。本质上,我正在开发一个项目,该项目将在网页上具有<video> 标签,并希望使用来自服务器的流加载视频,而不是通过路径直接提供文件。一个原因是文件的来源可能会改变,并且通过路径提供它们不是我的客户想要的。所以我需要能够打开一个流并异步写入视频文件。

由于某种原因,这会产生 JSON 数据,所以这是错误的。但我只是不明白如何将流式视频文件发送到 HTML 中的<video> 标记。

当前代码:

[HttpGet]
public HttpResponseMessage GetVideoContent()
{
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs))
    {
        using (var file = fs)
        {
            var range = Request.Headers.GetCommaSeparatedValues("Range").FirstOrDefault();
            if (range != null)
            {
                var msg = new HttpResponseMessage(HttpStatusCode.PartialContent);
                var body = GetRange(file, range);
                msg.Content = new StreamContent(body);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                //msg.Content.Headers.Add("Content-Range", $"0-0/{fs.Length}");
                return msg;
            }
            else
            {
                var msg = new HttpResponseMessage(HttpStatusCode.OK);
                msg.Content = new StreamContent(file);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                return msg;
            }
        }
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
}

【问题讨论】:

  • 您能否指定打开视频文件流的方式?

标签: c# video-streaming html5-video asp.net-core-2.0


【解决方案1】:

HttpResponseMessage 不用作asp.net-core 中的返回类型,它会将其读取为对象模型并通过设计在响应中将其序列化,正如您已经观察到的那样。

幸运的是,在 ASP.NET Core 2.0 中,您拥有

Enhanced HTTP header support

如果应用程序访问者请求带有 Range Request 标头的内容,ASP.NET 将识别并处理该标头。如果可以部分传递请求的内容,ASP.NET 将适当地跳过并仅返回请求的字节集。你不需要在你的方法中编写任何特殊的处理程序来适应或处理这个特性;它会自动为您处理。

所以现在你要做的就是返回文件流

[HttpGet]
public IActionResult GetVideoContent() {
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs)) {        
        FileStreamResult result = File(
            fileStream: fs, 
            contentType: new MediaTypeHeaderValue("video/mp4").MediaType, 
            enableRangeProcessing: true //<-- enable range requests processing
        );
        return result;
    }
     
    return BadRequest();
}

确保启用范围请求处理。但是,如文档中所述,应根据请求标头以及该数据是否可以部分交付来处理。

从那里开始,现在只需从视频客户端指向端点并让它发挥作用

【讨论】:

  • 这对我的问题很有帮助!如何启用视频播放器的搜索功能?我似乎无法让
  • 我还注意到服务器仅通过加载一个视频就使用了大量的内存。有什么方法可以提高效率?
  • @BaileyMiller 检查发出的请求以确保它正在使用范围标头。如果正确使用范围标头,则无需将整个文件加载到内存中。
  • @SruthiVarghese 通过阅读文件阐明了您的意思。您是指读取发布到控制器操作的文件吗?
  • @Nkosi 我无法使用Program.TryOpenFile()。因为它显示为 Program 没有任何类似的方法。我对 Asp .Net 的了解并不多。能否请您提供打开文件的解决方案?
猜你喜欢
  • 2020-09-20
  • 2020-08-31
  • 2020-04-22
  • 2015-10-24
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多