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

30

我目前正在使用.NET Core构建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中流式传输文件?

1
如果没有必要在您的应用中传输和存储这些视频文件,您可以使用一些云解决方案,比如 Azure Blob 存储或 Azure 媒体服务(如果您需要某些特定的媒体/流媒体功能)。使用 Azure Blob,您可以快速上传/下载文件,而不会给应用程序带来额外的负担。 - Guilherme Meinlschmiedt Abdo
1个回答

34

如果您想在浏览器中流式传输视频,您的服务器应支持HTTP范围请求。在这种情况下,服务器能够仅发送客户端请求的内容的一小部分。由于您希望在浏览器中流式传输视频,因此可以使用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);
}

请注意,路径必须是绝对路径(而非相对路径)。


有点晚了,但我想知道是否有人能够展示如何在前端的<video>标签中使用流? - CJH
@CJH 我也在想同样的问题。你找到什么了吗? - Avinash Reddy
@Mayo 怎样在视频标签中使用它? - Avinash Reddy
1
@AvinashReddy 你应该添加一个带有指向该端点的src属性的<source>标签,例如:<source src="api/[controllerName]/getFileById" type="video/mp4" /> - Mayo
@mayo,我们如何传递JWT令牌?视频API受令牌保护。 - Avinash Reddy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接