用于FileStream视频流的.NET Core 2.0 Web API

人气:654 发布:2022-10-16 标签: html5-video c# video-streaming asp.net-core-2.0

问题描述

我发现了一大堆示例,它们使用的对象在我的应用程序中不可用,并且似乎与我的.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);
    }
}

推荐答案

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

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

Enhanced HTTP header support

如果应用程序访问者请求带有Range请求标头的内容,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();
}

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

从那里开始,现在只需从视频客户端指向终端并让其发挥魔力

270