public async Task <ActionResult> GetStream(string name) { ViewBag.Title = "Video Streaming"; List <string> list = await SqlStreamController.GetVideoList(); TableVM model = new TableVM { Rows = list, Headers = new List <string> { "Nombre", "Acción" }, CurrentVideo = name }; return(View("index", model)); }
public async Task <HttpResponseMessage> GetStream(string name) { var response = Request.CreateResponse(); response.Headers.AcceptRanges.Add("bytes"); if (String.IsNullOrEmpty(name)) { return(response); } byte[] videobytes; if (cache[name] == null) { videobytes = await SqlStreamController.GetBinaryValue(name); cache.Set(name, videobytes, DateTime.Now.AddMinutes(30)); } else { videobytes = cache[name] as byte[]; } if (videobytes == null) { return(response); } MemoryStream stream = new MemoryStream(videobytes); RangeHeaderValue currentRangeHeader = Request.Headers.Range; const int blockSize = 1024 * 512; const string videoType = "video/mp4"; long totalLength = stream.Length; var range = currentRangeHeader.Ranges.First(); var start = range.From ?? 0; var ends = range.To ?? (start + blockSize - 1 > totalLength ? totalLength - 1 : start + blockSize - 1); RangeHeaderValue rangeHeader = new RangeHeaderValue(start, ends); response.Content = new ByteRangeStreamContent(stream, rangeHeader, videoType); response.Content.Headers.ContentLength = ends - start + 1; response.Content.Headers.ContentRange = new ContentRangeHeaderValue(start, ends, totalLength); response.Content.Headers.ContentType = new MediaTypeHeaderValue(videoType); response.StatusCode = HttpStatusCode.PartialContent; return(response); }