c# - 使用 HTML 5 和 ASP.NET MVC 5 的视频流

标签 c# asp.net-mvc html video streaming

我正在从事一个媒体文件管理项目,我被要求评估包括视频流以观看视频而不是下载视频(这是当前的方式)的可行性。可悲的是,我找不到很多指南(事实上,我找到了很多,但其中大部分都是过时的或最近对过时教程的引用)。我关注的是 this guide ,虽然我不需要它在全屏上工作。

所以基本上我正在做的(根据教程)是将其添加到 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 文件大小),由 View 发起(由于视频标签是正确的),是 GET 请求并返回 200 状态代码。
  • 第二个带0B,由'Other'(?)发起,是GET请求,返回200状态码。

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

我在 GetVideo 方法中添加了一个断点,我发现:

  • 确实收到了两个请求
  • 第一个请求启用 View 中的播放按钮(但如果我单击它不会播放任何内容),此方法的第二个请求禁用播放按钮(你知道,它变成灰色且无法单击) .

所以这是我的问题:为什么视频没有播放?为什么 Controller 会收到两个请求?

P/S:是的,视频在那个文件夹里。是的,这是文件的名称和扩展名。是的,我可以直接用浏览器播放视频。

最佳答案

返回文件流与“流”不同。从技术上讲,服务器只是一次性推送视频文件。客户端然后就像他们真的在下载文件一样下载文件。如果客户端(Web 浏览器)能够解释视频文件并且视频文件能够被流式传输(前端加载 header ),那么浏览器可能会在它完全完成之前开始播放它,但这也不是真正的流媒体。它更类似于加载渐进式 JPEG:浏览器主动尝试在完整信息集可用之前尽快显示信息。如果连接变慢,视频将停止。没有缓冲的概念。

如果你想真正流式传输视频,你需要一个真正的流媒体服务器。有多种选择,但通常它们的工作方式是调整视频文件以适应与客户端的连接:更少或更多的比特率。正是这种交互,您将不会仅仅通过 MVC 或什至直接通过 IIS 推送文件。

无论您是采用真正的流媒体解决方案,还是仅依靠浏览器在下载视频时播放视频,您仍应将其与您的实际 MVC 站点分开。 Web 服务器只能处理有限数量的请求,并且它们被设计为尽可能快地(几秒甚至几毫秒)清除这些请求。它们适合在需要几分钟或更长时间的单个响应中发送大量数据。如果对视频的请求数量足够多,您最终可能会导致网络服务器陷入僵局并关闭整个站点。由于是不同的服务器,流式服务器不会造成这个问题。或者,您可以将文件托管在 CDN 上。

关于c# - 使用 HTML 5 和 ASP.NET MVC 5 的视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317321/

相关文章:

c# - 与 protobuf-net 和 C# 的接口(interface)

c# - ElasticSearch .net GeoDistance过滤器不起作用

javascript - Ajax调用angularJs调用方法

php - AJAX 加载从 onclick 调用的 php 脚本时出现问题;

html - 为什么我的文本区域比它的邻居高?

c# - Windows Live/Hotmail 检索联系人的电子邮件

c# - 将二维数组旋转 45 度

asp.net-mvc - ASP.NET MVC 读取原始 JSON 发布数据

c# - DataAnnotations "NotRequired"属性

javascript - 如何从多个元素的特定范围获取文本