代码之家  ›  专栏  ›  技术社区  ›  Bailey Miller

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

  •  8
  • Bailey Miller  · 技术社区  · 7 年前

    我发现了一些示例,它们使用的对象在我的应用程序中不可用,并且似乎与我的版本不匹配。NET核心web API。本质上,我正在从事一个 <video> 标签,并希望使用来自服务器的流加载视频,而不是通过路径直接为文件提供服务。一个原因是文件的来源可能会发生变化,通过path提供文件并不是我的客户想要的。所以我需要能够打开一个流并异步写入视频文件。

    出于某种原因,这会生成JSON数据,所以这是错误的。但我不明白要将流式视频文件发送到 <视频(>); 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);
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  13
  •   Community CDub    4 年前

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

    幸运的是ASP。NET Core 2.0

    Enhanced HTTP header support

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

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

    从这里开始,现在只需从视频客户端指向端点,让它发挥其魔力