我正在开发一个人们可以访问音频和视频文件的网站。我有下载文件的代码,它由以下两个操作方法组成......
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 ,当我单击播放按钮时没有任何反应。不确定这是否有帮助。
最佳答案
MvcController
的File
方法返回一个FileContentResult
。后者不流式传输内容。据我所知,MvcController
根本不支持流。
您可能想尝试 ApiController
和 PushStreamContent
。后者提供了通过回调方法异步写入输出流的可能性。为此,您需要在解决方案中使用实际流。使用 byte[]
将始终将整个文件内容加载到内存中。
请在此处查看详细教程:Asynchronously streaming video with ASP.NET Web API
关于c# - 如何使用 ASP.NET MVC 流式传输视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535845/