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

.NET Core 2.0 Web API for Video Streaming from FileStream(用于FileStream视频流的.NET Core 2.0 Web API)
本文介绍了用于FileStream视频流的.NET Core 2.0 Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

这篇关于用于FileStream视频流的.NET Core 2.0 Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)