I have used http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/ this technique before and worked perfect for async video streaming.
But for ASP.NET Core this way is not working as expected.
By Video streaming class is:
public class VideoStream { private readonly string _filename; public VideoStream(string filename) { _filename = filename; } public async Task WriteToStream(Stream outputStream, HttpContent content, TransportContext context) { try { var buffer = new byte[65536]; using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read)) { var length = (int)video.Length; var bytesRead = 1; while (length > 0 && bytesRead > 0) { bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length)); await outputStream.WriteAsync(buffer, 0, bytesRead); length -= bytesRead; } } } catch (Exception) { return; } finally { outputStream.Flush(); outputStream.Dispose(); } } }
and I have the following Action for video streaming requests:
[HttpGet] [Route("[action]")] public IActionResult GetVideo(int id) { var fileName = GetVideoFileName(id); var video = new VideoStream(fileName); var response = new HttpResponseMessage { Content = new PushStreamContent(video.WriteToStream, new MediaTypeHeaderValue("video/mp4")) }; var objectResult = new ObjectResult(response); objectResult.ContentTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("video/mp4")); return objectResult; }
Since by default Asp.Net Core doesn't have built-in Media Formatter for video/mp4 I have created the following custom Media Formatter
public class VideoOutputFormatter : IOutputFormatter { public bool CanWriteResult(OutputFormatterCanWriteContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); return true; } public async Task WriteAsync(OutputFormatterWriteContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); var response = context.HttpContext.Response; response.ContentType = "video/mp4"; How to impelemnt ??? } }
and added the following line to Startup.cs
services.AddMvc(options => { options.OutputFormatters.Add(new VideoOutputFormatter()); });
It actually calls my custom formatter. I doesn't know how to implement this custom media formatter for video/mp4. Anyone can help me ?