从FileStream进行视频流的.NET Core 2.0 Web API

Bai*_*ler 4 c# video-streaming html5-video asp.net-core-2.0

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

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

当前代码:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 10

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

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

增强的HTTP标头支持

如果应用程序访问者使用“范围请求”标头请求内容,则ASP.NET将识别该内容并处理该标头。如果可以部分传递所请求的内容,则ASP.NET将适当地跳过并仅返回所请求的字节集。您无需在方法中编写任何特殊处理程序即可适应或处理此功能。它会自动为您处理。

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

[HttpGet]
public IActionResult GetVideoContent() {
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs)) {        
        return new FileStreamResult(fs, new MediaTypeHeaderValue("video/mp4").MediaType);
    }

    return BadRequest();
}
Run Code Online (Sandbox Code Playgroud)

现在,从视频客户端指向端点很简单,让它发挥作用