[英]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.