asp.net-mvc – 使用MVC FileStream播放视频文件的问题
发布时间:2020-12-16 07:45:35 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试使用以下代码来检索要播放给用户的视频文件: public class VideoController : Controller{ public VideoResult GetMP4Video(string videoID) { if (User.Identity.IsAuthenticated) { string clipLocation = string.Format("{0}Completed{1}.
我正在尝试使用以下代码来检索要播放给用户的视频文件:
public class VideoController : Controller { public VideoResult GetMP4Video(string videoID) { if (User.Identity.IsAuthenticated) { string clipLocation = string.Format("{0}Completed{1}.mp4",ConfigurationManager.AppSettings["VideoLocation"].ToString(),videoID); using (FileStream stream = new FileStream(clipLocation,FileMode.Open)) { FileStreamResult fsResult = new FileStreamResult(stream,"video/mp4"); VideoResult result = new VideoResult(ReadFully(fsResult.FileStream),"video/mp4"); return result; } } else { return null; } } private static byte[] ReadFully(Stream input) { byte[] buffer = new byte[32 * 1024]; using (MemoryStream ms = new MemoryStream()) { int read; while ((read = input.Read(buffer,buffer.Length)) > 0) { ms.Write(buffer,read); } return ms.ToArray(); } } } 为了向客户端显示我正在使用媒体元素: <!-- Video Player Here --> <video width="640" height="360" poster="@Url.Content(string.Format("~/Videos/{0}_2.jpg",Model.VideoID))" controls="controls" preload="none"> <!-- MP4 for Safari,IE9,iPhone,iPad,Android,and Windows Phone 7 --> <source type="video/mp4" src="@Url.Action("GetMP4Video","Video",new { videoID = Model.VideoID })" /> <!-- Flash fallback for non-HTML5 browsers without JavaScript --> <object width="320" height="240" type="application/x-shockwave-flash" data="@Url.Content("~/Scripts/ME/flashmediaelement.swf")"> <param name="movie" value="@Url.Content("~/Scripts/ME/flashmediaelement.swf")" /> <param name="flashvars" value="controls=true&file=@Url.Action("GetMP4Video",new { videoID = Model.VideoID })" /> <!-- Image as a last resort --> <img src="myvideo.jpg" width="320" height="240" title="No video playback capabilities" /> </object> </video> 问题是该文件似乎没有播放或至少不一致.在视频中寻找也似乎不能正常工作.我想我的问题是这是一种向用户提供视频的可接受方式吗?如果是这样,我错了什么?我认为重要的是我对视频非常陌生,而且我正在学习.任何帮助,将不胜感激. 解决方法
这适合我.改编自
here:
internal static void StreamVideo(string fullpath,HttpContextBase context) { long size,start,end,length,fp = 0; using (StreamReader reader = new StreamReader(fullpath)) { size = reader.BaseStream.Length; start = 0; end = size - 1; length = size; // Now that we've gotten so far without errors we send the accept range header /* At the moment we only support single ranges. * Multiple ranges requires some more work to ensure it works correctly * and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2 * * Multirange support annouces itself with: * header('Accept-Ranges: bytes'); * * Multirange content must be sent with multipart/byteranges mediatype,* (mediatype = mimetype) * as well as a boundry header to indicate the various chunks of data. */ context.Response.AddHeader("Accept-Ranges","0-" + size); // header('Accept-Ranges: bytes'); // multipart/byteranges // http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2 if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"])) { long anotherStart = start; long anotherEnd = end; string[] arr_split = context.Request.ServerVariables["HTTP_RANGE"].Split(new char[] { Convert.ToChar("=") }); string range = arr_split[1]; // Make sure the client hasn't sent us a multibyte range if (range.IndexOf(",") > -1) { // (?) Shoud this be issued here,or should the first // range be used? Or should the header be ignored and // we output the whole content? context.Response.AddHeader("Content-Range","bytes " + start + "-" + end + "/" + size); throw new HttpException(416,"Requested Range Not Satisfiable"); } // If the range starts with an '-' we start from the beginning // If not,we forward the file pointer // And make sure to get the end byte if spesified if (range.StartsWith("-")) { // The n-number of the last bytes is requested anotherStart = size - Convert.ToInt64(range.Substring(1)); } else { arr_split = range.Split(new char[] { Convert.ToChar("-") }); anotherStart = Convert.ToInt64(arr_split[0]); long temp = 0; anotherEnd = (arr_split.Length > 1 && Int64.TryParse(arr_split[1].ToString(),out temp)) ? Convert.ToInt64(arr_split[1]) : size; } /* Check the range and make sure it's treated according to the specs. * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */ // End bytes can not be larger than $end. anotherEnd = (anotherEnd > end) ? end : anotherEnd; // Validate the requested range and return an error if it's not correct. if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size) { context.Response.ContentType = MimeMapping.GetMimeMapping(fullpath); context.Response.AddHeader("Content-Range","Requested Range Not Satisfiable"); } start = anotherStart; end = anotherEnd; length = end - start + 1; // Calculate new content length fp = reader.BaseStream.Seek(start,SeekOrigin.Begin); context.Response.StatusCode = 206; } } // Notify the client the byte range we'll be outputting context.Response.AddHeader("Content-Range","bytes " + start + "-" + end + "/" + size); context.Response.AddHeader("Content-Length",length.ToString()); // Start buffered download context.Response.WriteFile(fullpath,fp,length); context.Response.End(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 使用LINQ从MVC调用存储过程而不指定类结构(
- asp.net-mvc – AspNet Identity 2.0电子邮件和用户名重复
- asp.net-mvc – TempData keep()vs peek()
- asp.net – Team Build 2010和web.config转换的问题
- asp.net-mvc – MVC – 编辑对象列表
- .NET Core技术研究系列-索引篇 .NET Core技术研
- ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码
- asp.net – 将HTML表导出到Excel
- asp.net – 在框架4.5下添加新的Web服务
- asp.net-mvc – 具有Microsoft.AspNet.Identity的自定义成员
推荐文章
站长推荐
- asp.net webforms jquery =无法按下按钮
- ASP.NET ReportViewer在本地模式下非常慢
- asp.net-mvc – 为什么ASP.NET MVC在从IE而不是f
- asp.net-core – AspNetCore中的控制器配置
- asp.net-mvc – 如何根据设备类型更改ASP.NET MV
- asp.net-mvc-3 – 任务/线程的Ninject Scope问题
- asp.net-core – 使用[FromBody]时获取原始POST数
- asp.net核心 – 如何在Asp.Net Core中注册同一个
- asp.net-mvc-3 – 在图表.net mvc3中设置间隔
- asp.net – 单独配置文件为web.config的部分
热点阅读