c# - 如何使用 ASP.NET MVC 流式传输视频文件?

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

我正在开发一个人们可以访问音频和视频文件的网站。我有下载文件的代码,它由以下两个操作方法组成......

public ActionResult GetAudioFile(int id) {
  return GetFile(id, true);
}

public ActionResult GetVideoFile(int id) {
  return GetFile(id, false);
}

private ActionResult GetFile(int id, bool isAudio) {
  // Code to get info about the file, etc omitted for clarity
  string downloadFileName = // full path to audio/video file
  byte[] bytes = GetFileBytes(fileName); // also omitted
  return File(bytes, (isAudio ? "audio/mpeg" : "video/mp4"), downloadFileName + (isAudio ? ".mp3" : ".mp4"));
}

这两个都可以正常工作,我可以下载任何一种类型的文件。

我现在想添加两个 Razor View ,一个用于收听音频文件,一个用于观看视频。我在音频 View 上做了以下操作,效果很好......

<audio src='@Url.Action("GetAudioFile", "Search", new {ID = @Model.ID})'
               controls preload="auto"></audio>

然后我尝试对视频 View 执行相同的操作...

<video src='@Url.Action("GetVideoFile", "Search", new {ID = @Model.ID})' 
               controls preload="auto" width="640" height="368"></video>

但是,当我尝试运行它时会出现 System.OutOfMemoryException。每个视频的平均大小约为 400-500Mb。

然后我尝试使用 Response.TransmitFile 方法如下...

  Response.ContentType = "video/mp4";
  Response.AddHeader("content-disposition", "attachment; filename=myvideo.mp4"));
  Response.TransmitFile(fileName);
  Response.End();
  return null;

...但这不起作用。在 Chrome 中,我可以在控制台中看到消息“资源解释为文档,但使用 MIME 类型视频/mp4 传输”,而在 FireFox 中,我在视频控件中看到相同的消息。

有人知道我该如何解决这个问题吗?理想情况下,我想流式传输文件,以便在第一个字节到达用户时立即开始播放,而不是让他们等到文件完全下载完毕。

我试过几个 Javascript 视频播放器,但都没有成功。

更新 我想知道问题是否根本不是 Controller 操作,因为我尝试将我的网络浏览器直接指向视频文件,我得到了一个看起来像音频播放器的东西,但是没有视频 Pane ,当我单击播放按钮时没有任何反应。不确定这是否有帮助。

最佳答案

MvcControllerFile 方法返回一个FileContentResult。后者不流式传输内容。据我所知,MvcController 根本不支持流。

您可能想尝试 ApiControllerPushStreamContent。后者提供了通过回调方法异步写入输出流的可能性。为此,您需要在解决方案中使用实际流。使用 byte[] 将始终将整个文件内容加载到内存中。

请在此处查看详细教程:Asynchronously streaming video with ASP.NET Web API

关于c# - 如何使用 ASP.NET MVC 流式传输视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535845/

相关文章:

java - 如何从 Tomcat 流式传输自定义视频

java - 在 elasticsearch 中存储视频的推荐方式是什么?

asp.net-mvc - 是否可以在 ASPX 模式下使用 ViewBag 设置页面标题?

asp.net-mvc - 如何在我的网站中包含 WMD 编辑器?

c# - 文本框不允许我输入小数

c# - 如何在 .NET ASP C# 中正确使用 QueryString?

html - Twitter Bootstrap MVC 替代方案

audio - 使用软件或命令行从音频/视频中消除人的声音

c# - 快速将类属性公开为可绑定(bind)

c# - 如何从 Pacer.gov API 发出案例请求?