簡體   English   中英

.NET Core 2.0 Web API 用於來自 FileStream 的視頻流

[英].NET Core 2.0 Web API for Video Streaming from FileStream

我發現了一堆示例,這些示例在我的應用程序中使用了我不可用的對象,並且似乎與我的 .NET Core Web API 版本不匹配。 本質上,我正在開發一個將在網頁上具有<video>標簽的項目,並希望使用來自服務器的流加載視頻,而不是通過路徑直接提供文件。 原因之一是文件的來源可能會發生變化,而通過路徑為它們提供服務並不是我的客戶想要的。 所以我需要能夠打開一個流並異步寫入視頻文件。

由於某種原因,這會產生 JSON 數據,所以這是錯誤的。 但我只是不明白我需要做什么才能將流式視頻文件發送到 HTML 中的<video>標簽。

當前代碼:

[HttpGet]
public HttpResponseMessage GetVideoContent()
{
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs))
    {
        using (var file = fs)
        {
            var range = Request.Headers.GetCommaSeparatedValues("Range").FirstOrDefault();
            if (range != null)
            {
                var msg = new HttpResponseMessage(HttpStatusCode.PartialContent);
                var body = GetRange(file, range);
                msg.Content = new StreamContent(body);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                //msg.Content.Headers.Add("Content-Range", $"0-0/{fs.Length}");
                return msg;
            }
            else
            {
                var msg = new HttpResponseMessage(HttpStatusCode.OK);
                msg.Content = new StreamContent(file);
                msg.Content.Headers.Add("Content-Type", "video/mp4");
                return msg;
            }
        }
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
}

HttpResponseMessage不用作asp.net-core的返回類型,它會將其作為對象模型讀取並按照設計在響應中將其序列化,正如您已經觀察到的。

幸運的是,在 ASP.NET Core 2.0 中,您有

增強的 HTTP 標頭支持

如果應用程序訪問者請求帶有 Range Request 標頭的內容,ASP.NET 將識別並處理該標頭。 如果請求的內容可以部分傳遞,ASP.NET 將適當地跳過並僅返回請求的字節集。 你不需要在你的方法中編寫任何特殊的處理程序來適應或處理這個特性; 它會自動為您處理。

所以現在你要做的就是返回文件流

[HttpGet]
public IActionResult GetVideoContent() {
    if (Program.TryOpenFile("BigBuckBunny.mp4", FileMode.Open, out FileStream fs)) {        
        FileStreamResult result = File(
            fileStream: fs, 
            contentType: new MediaTypeHeaderValue("video/mp4").MediaType, 
            enableRangeProcessing: true //<-- enable range requests processing
        );
        return result;
    }
     
    return BadRequest();
}

確保啟用范圍請求處理。 但是,如文檔中所述,應該根據請求標頭以及該數據是否可以部分交付來處理。

從那里現在是從視頻客戶端指向端點並讓它發揮其魔力的簡單問題

暫無
暫無

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

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