Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NET Core 3的流媒体视频_C#_.net_Asp.net Mvc_Asp.net Core_Streaming - Fatal编程技术网

C# 使用ASP.NET Core 3的流媒体视频

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

我目前正在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(例如)

我已经尝试在这些网站上使用这些代码,但是他们的方式与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);
}