簡體   English   中英

使用HTML 5和ASP.NET MVC 5進行視頻流傳輸

[英]Video Streaming with HTML 5 and ASP.NET MVC 5

我正在研究一個媒體文件管理項目,我被要求評估包含視頻流來觀看視頻而不是下載視頻的可行性(這是當前的方式)。 可悲的是,我找不到很多指南(事實上,我發現很多指南,但大多數指南都已過時或最近引用了過時的教程)。 我正在關注的是本指南 ,雖然我不需要它全屏工作。

基本上我正在做的事情(根據教程)是將它添加到HomeController.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
...
public ActionResult GetVideo()
    {
        var videoPath = Request.MapPath("~/Content/music.mp4");
        FileStream fs = new FileStream(videoPath, FileMode.Open);
        return new FileStreamResult(fs, "video/mp4");
    }

這到Index.cshtml:

<video controls="controls" id="videoPlayer">
    <source src="~/home/getvideo" type="video/mp4">
</video>

如您所見,我只是使用MVC 5和HTML5,因為我無法添加工具或插件以保持項目的簡單性。

無論如何,通過Chrome DevTools觀看網絡交易我可以看到GetVideo方法有兩個請求:

  • 第一個帶來50Mb文件(這是完整的mp4文件大小),由視圖啟動(由於視頻標簽是正確的),是GET請求並返回200狀態代碼。
  • 第二個帶0B,由'Other'(?)啟動,是GET請求並返回200狀態代碼。

除此之外,我無法播放文件!

我在GetVideo方法中添加了一個斷點,我發現:

  • 它確實收到兩個請求
  • 第一個請求啟用視圖中的播放按鈕(但如果我單擊它不播放任何內容),則對此方法的第二個請求將禁用播放按鈕(您知道,它變為灰色且無法單擊)。

所以這是我的問題:為什么視頻沒有播放? 為什么控制器會收到兩個請求?

P / S:是的,視頻在該文件夾中。 是的,這是文件的名稱和擴展名。 是的,我可以直接使用瀏覽器播放視頻。

返回文件流與“流式傳輸”不同。 從技術上講,服務器只是一次性推送視頻文件。 然后客戶端只是下載文件,就像他們真正下載文件一樣。 如果客戶端(Web瀏覽器)能夠解釋視頻文件並且視頻文件能夠進行流式處理(前端加載標題),那么瀏覽器可能會在完全完成之前開始播放它,但這也不是真的流媒體 它更類似於加載漸進式JPEG:瀏覽器在全部信息可用之前主動嘗試盡快顯示信息。 如果連接速度變慢,視頻將停止。 沒有緩沖的概念。

如果您想真正流式傳輸視頻,則需要一個真正的流媒體服務器。 這里有各種各樣的選項,但通常它們的工作方式是通過調整視頻文件與客戶端的連接:更低或更高的比特率。 這種互動你不會只是通過MVC推送文件,甚至直接通過IIS推送文件。

無論您是使用真正的流媒體解決方案還是僅僅依靠瀏覽器播放視頻,您仍應將其與實際的MVC網站隔離開來。 Web服務器可以處理有限數量的請求,它們旨在盡快(幾秒甚至幾毫秒)清除這些請求。 它們適合在單個響應中發送大量數據,這需要花費幾分鍾或更長時間。 如果視頻的請求數量足夠大,您最終可能會導致Web服務器死鎖並占用整個站點。 由於是不同的服務器,流媒體服務器不會造成這個問題。 或者,您可以在CDN上托管文件。

暫無
暫無

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

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