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

Posted

技术标签:

【中文标题】使用 ASP.NET Core 3 流式传输视频【英文标题】:Streaming videos with ASP.NET Core 3 【发布时间】:2020-04-22 21:18:09 【问题描述】:

我目前正在 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 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 中流式传输文件?

【问题讨论】:

如果没有必要在应用程序中传输和存储这些视频文件,您可以使用一些云解决方案,如 Azure Blob 存储或 Azure 媒体服务(如果您需要一些特定的媒体/流媒体功能) .使用 Azure Blob,您可以快速上传/下载文件,而不会增加应用程序的开销。 【参考方案1】:

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

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

返回由physicalPath指定的文件(Status200OK), 将 contentType 指定为 Content-Type,并指定 fileDownloadName 作为建议的文件名。这支持范围 请求(Status206PartialContent 或 Status416RangeNotSatisfiable 如果 范围不可满足)。

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

    ...
    return PhysicalFile($"C:/movies/file.Name", "application/octet-stream", enableRangeProcessing: true);

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

【讨论】:

我试试,非常感谢您的回复! 有点晚了,但想知道是否有人能够在前端 @CJH 我也想知道。你有什么发现吗? @Mayo 如何在视频标签中使用它? @AvinashReddy 您应该添加带有指向该端点的 src 属性的 标记,例如

以上是关于使用 ASP.NET Core 3 流式传输视频的主要内容,如果未能解决你的问题,请参考以下文章

将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页

如何在 ASP.Net MVC 中实现视频文件流式传输?

在 ASP.NET 中流式传输文件的最佳方式

在 ASP.NET Core 中上传文件

在 ASP.NET 中上传流和播放视频

在ASP.NET Core 中上传文件