C# 使用ASP.NET Core 3的流媒体视频
我目前正在ASP.NET Core 3中构建API,这是我使用.NET Core的第一个项目 我目前正在尝试将视频发送到我的React.js前端,以便在浏览器中观看。上传文件和视频不会有问题,下面的方法也会将文件发送到客户端,但如果视频超过几秒钟,视频播放器速度会非常慢,跳过几秒钟的视频也需要很长时间。我认为这是因为文件首先被完全下载,然后被播放C# 使用ASP.NET Core 3的流媒体视频,c#,.net,asp.net-mvc,asp.net-core,streaming,C#,.net,Asp.net Mvc,Asp.net Core,Streaming,我目前正在ASP.NET Core 3中构建API,这是我使用.NET Core的第一个项目 我目前正在尝试将视频发送到我的React.js前端,以便在浏览器中观看。上传文件和视频不会有问题,下面的方法也会将文件发送到客户端,但如果视频超过几秒钟,视频播放器速度会非常慢,跳过几秒钟的视频也需要很长时间。我认为这是因为文件首先被完全下载,然后被播放 [Route("getFileById")] public FileResult getFileById(int fileId) { var
[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(例如)
我已经尝试在这些网站上使用这些代码,但是他们的方式与ASP.NET Core 3不兼容
如何在ASP.NET Core 3中传输文件?如果要在浏览器中传输视频,服务器应支持。在这种情况下,服务器只能发送客户端请求的内容的一小部分。当您想在浏览器中传输视频时,可以使用
video
html标记,该标记使用范围标题请求内容。因此,您也可以跳过一些时间,在电影完全下载之前,立即从该位置播放电影
ASP.NET Core 3已经支持HTTP范围请求,它是在PhysicalFile
方法中实现的,该方法具有属性enableRangeProcessing。正如文件所说:
返回physicalPath(Status200OK)指定的文件 指定contentType作为内容类型,并指定 fileDownloadName作为建议的文件名。这支持范围 请求(状态206部分内容或状态416范围不可满足,如果 该范围不令人满意)
请注意,路径必须是绝对的(而不是相对的)。别忘了pyshicalfile返回的内容太过部分
我试试看,非常感谢您的回复!有点晚了,但想知道是否有人能在前端标签中显示流是如何被消费的?@CJH我也在想同样的问题。你找到什么了吗?@Mayo如何在视频标签中使用它?@AvinashReddy你应该添加带有指向该端点的src属性的标签,例如,如果真的没有必要在你的应用程序中传输和存储这些视频文件,你可以使用一些云解决方案,如Azure Blob存储或Azure媒体服务(如果您需要某些特定的媒体/流媒体功能)。使用Azure Blob,您可以快速上载/下载文件,而不会使应用程序过热。返回physicalPath指定的文件(Status200OK),指定的contentType作为内容类型,指定的fileDownloadName作为建议的文件名。这支持范围请求(如果范围不可满足,则为Status206PartialContent或Status416RangeNotSatisfable)。
[Route("getFileById")]
public FileResult getFileById(int fileId)
{
...
return PhysicalFile($"C:/movies/{file.Name}", "application/octet-stream", enableRangeProcessing: true);
}