使用 ASP.NET Core 3 流式传输视频

Streaming videos with ASP.NET Core 3

我目前正在 ASP.NET Core 3 中构建一个 API 作为我使用 .NET Core 的第一个项目。

我目前正在尝试将视频发送到我的 React.js 前端,以便在浏览器中观看。上传文件和视频确实没有问题,你在下面看到的方法也已经向客户端发送了一个文件,但是如果视频超过几秒钟,视频播放器真的很慢,也需要很长时间才能跳过几秒钟的视频。我认为那是因为文件首先被完全下载而不是播放。

[Route("getFileById")]
public FileResult getFileById(int fileId)
{

    var context = new DbContext();

    var file = context.File.Find(fileId);

    if (file == null)
    {
        Console.WriteLine("file " + fileId + " not found");
        return null;
    }

    var content  = new FileStream(file.Name, FileMode.Open, FileAccess.Read, FileShare.Read);
    var response = File(content, "application/octet-stream");
    return response;
}

我认为解决我的问题的方法是流式传输文件而不是将其作为一个整体发送。 我已经在谷歌上搜索过如何使用 ASP.NET Core 3 流式传输视频,但我只找到了针对 ASP.NET Core 2 进行解释的网站(例如 http://anthonygiretti.com/2018/01/16/streaming-video-asynchronously-in-asp-net-core-2-with-web-api/

我已经尝试在这些网站上使用代码,但他们使用的方式与 ASP.NET Core 3 不兼容。

如何在 ASP.NET Core 3 中传输文件?

如果你想在浏览器中播放视频,你的服务器应该支持HTTP range requests。在这种情况下,服务器只能发送客户端请求的一小部分内容。当您想在浏览器中流式传输视频时,您可以使用 video html 标签来请求使用范围 headers 的内容。因此您也可以跳过一些时间并在电影完全下载之前立即从该位置开始播放电影。

ASP.NET Core 3 已经支持 HTTP 范围请求,它是在具有属性 enableRangeProcessingPhysicalFile 方法中实现的。正如文档所说:

Returns the file specified by physicalPath (Status200OK), the specified contentType as the Content-Type, and the specified fileDownloadName as the suggested file name. This supports range requests (Status206PartialContent or Status416RangeNotSatisfiable if the range is not satisfiable).

[Route("getFileById")]
public FileResult getFileById(int fileId)
{
    ...
    return PhysicalFile($"C:/movies/{file.Name}", "application/octet-stream", enableRangeProcessing: true);
}

注意路径必须是绝对路径(不是相对路径)。