簡體   English   中英

使用 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 范圍請求 在這種情況下,服務器只能發送客戶端請求的內容的一小部分。 當您想在瀏覽器中流式傳輸視頻時,您可以使用video html 標簽,該標簽使用范圍標頭請求內容。 因此,您也可以跳過一些時間並在完全下載之前立即從該位置播放電影。

ASP.NET Core 3 已經支持 HTTP 范圍請求,它是在具有屬性enableRangeProcessing 的PhysicalFile方法中實現的 正如文檔所說:

返回由 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);
}

請注意,路徑必須是絕對的(不是相對的)。

不要忘記比 pyshicalfile 返回太部分內容的外觀

關聯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM