asp.net 核心 2 中的流媒体视频文件

Streaming video files in asp.net core 2

我想在使用 asp.net 内核的浏览器中播放视频

在 html 我有

<video width="320" height="240" controls>
 <source src="http://localhost:55193/api/VideoPlayer/Download" type="video/mp4">
 Your browser does not support the video tag.
</video>

并在 asp.net 核心 2

    [HttpGet]
    [Route("Download")]
    public async Task<IActionResult> Download()
    {
        var path = @"d:\test\somemovie.mp4";
        var memory = new MemoryStream();
        using (var stream = new FileStream(@"d:\test\somemovie.mp4", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 65536, FileOptions.Asynchronous | FileOptions.SequentialScan))
        {
            await stream.CopyToAsync(memory);
        }
        memory.Position = 0;
        return File(memory, "application/octet-stream", Path.GetFileName(path));
    }

此代码是否通过流播放文件(我的意思是缓冲文件一块一块地播放)?

如果我想从用户设置播放器进度的任何位置播放文件,我该怎么做?

在这里使用正常的return PhysicalFile:

public class HomeController : Controller
    {
        public IActionResult Download()
        {
            return PhysicalFile(@"d:\test\somemovie.mp4", "application/octet-stream");
        }

因为它支持流式传输和恢复文件下载所必需的范围 headers:

此外,return FileFileStreamResultVirtualFileResult 也支持 partial range requests。甚至 static files middleware 也支持。

出了点问题。我的示例不支持简历

    [HttpGet]
    [Route("Download2")]
    public IActionResult Download2()
    {
        return PhysicalFile(@"d:\test\somemovie.mp4", "application/octet-stream");
    }

并且没有accept-ranges响应headers

但是当我使用

[HttpGet]
    [Route("Download")]
    public async Task<IActionResult> Download()
    {
        var path = @"d:\test\somemovie.mp4";
        var memory = new MemoryStream();
        using (var stream = new FileStream(@"d:\test\somemovie.mp4", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 65536, FileOptions.Asynchronous | FileOptions.SequentialScan))
        {
            await stream.CopyToAsync(memory);
        }
        memory.Position = 0;
        return File(memory, "application/octet-stream", Path.GetFileName(path),true); //enableRangeProcessing = true
    }

带 "enableRangeProcessing" 参数 true

你能提供更多解释为什么会这样吗? 我应该使用哪种解决方案?我一头雾水。

  static MediaStream song = null;
        static byte[] SongArray = null;

song = await client.GetMediaStreamAsync(streamFilter).ConfigureAwait(false);
                        MemoryStream ms = new MemoryStream();
                        song.CopyTo(ms);
                        SongArray = ms.ToArray();

  long fSize = song.Length, startbyte = 0, endbyte = fSize - 1;
                int statusCode = 200;

                var rangeRequest = Request.Headers["Range"].ToString();
                if (!string.IsNullOrEmpty(rangeRequest))
                {
                    string[] range = Request.Headers["Range"].ToString().Split(new char[] { '=', '-' });
                    startbyte = Convert.ToInt64(range[1]);

                    if (range.Length > 2 && range[2] != "")
                    {
                        endbyte = Convert.ToInt64(range[2]);
                    }

                    if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "")
                    {
                        statusCode = 206;
                    }
                }

                long desSize = endbyte - startbyte + 1;
                Response.StatusCode = statusCode;
                //  Response.Headers.Add(ETag = new EntityTagHeaderValue(String.Format("\"{0}\"", _eTag));
                Response.ContentType = "video/" + streamFilter.Container.GetFileExtension();
                Response.Headers.Add("Content-Accept", Response.ContentType);
                Response.Headers.Add("Content-Length", desSize.ToString());
                Response.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte, fSize));
                return new FileStreamResult(new MemoryStream(SongArray, (int)startbyte, (int)desSize), Response.ContentType);