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

Avr*_*oel 10 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"));
}
Run Code Online (Sandbox Code Playgroud)

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

我现在想要添加两个Razor视图,一个用于监听音频文件,另一个用于观看视频.我在音频视图上做了以下操作,它工作正常......

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

然后我尝试为视频视图做同样的事情......

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

但是,当我尝试运行它时,这会产生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;
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试了几个Javascript视频播放器,但也取得了成功.

更新我想知道控制器操作是否完全没问题,因为我尝试将我的网络浏览器直接指向视频文件,我看起来像一个音频播放器,但没有视频窗格,没有任何反应我点击播放按钮.不确定这是否有帮助.

bst*_*zel 6

返回的File方法MvcControllera FileContentResult.后者不会流式传输内容.据我所知,MvcController根本不支持流式传输.

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

请参阅此处的详细教程:使用ASP.NET Web API异步流式传输视频