代码之家  ›  专栏  ›  技术社区  ›  unos baghaii

ASP.NET核心2中的流视频文件

  •  1
  • unos baghaii  · 技术社区  · 6 年前

    我想使用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));
        }
    

    此代码是否通过流媒体播放文件(我的意思是缓冲区文件逐块播放)?

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

    3 回复  |  直到 5 年前
        1
  •  1
  •   VahidN    6 年前

    只需使用Normal Return PhysicalFile here:。

    public class homecontroller:controller
    {
    公共IActionResult下载()
    {
    返回physicalfile(@“d:\test\somemovie.mp4”,“application/octet stream”);
    }
    
    
    

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

    return file,filestreamresultandvirtualfileresultsupportpartial range requeststoo.即使是静态文件中间件也支持这一点。

    因为它支持流式传输和恢复文件下载所需的范围头文件: enter image description here

    阿尔索return File,FileStreamResultVirtualFileResult支持partial range requests也是。偶数static files middleware也支持这一点。

        2
  •  1
  •   unos baghaii    6 年前

    出了点问题。我的样本不支持简历

    [httpget]
    [路线(“下载2”)]
    公共IActionResult下载2()
    {
    返回physicalfile(@“d:\test\somemovie.mp4”,“application/octet stream”);
    }
    

    响应头中没有接受范围

    但当我使用

    [httpget]
    [路由(“下载”)]
    公共异步任务<IActionResult>下载()
    {
    var path=@“d:\test\somemovie.mp4”;
    var memory=new memoryStream();
    使用(var stream=new filestream(@“d:\test\somemovie.mp4”,filemode.open,fileaccess.read,fileshare.readwrite,65536,fileoptions.asynchronous fileoptions.sequentialscan))
    {
    wait stream.copytoAsync(内存);
    }
    记忆位置=0;
    返回文件(内存,“application/octet stream”,path.getfilename(path),true);/enableRangeProcessing=true
    }
    
    
    

    “EnableRangeProcessing”参数为真

    你能解释一下为什么会这样吗? 我应该使用哪种解决方案?我很困惑。

    enter image description here

    响应头中没有接受范围

    enter image description here

    但当我使用

    [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”参数为真

    enter image description here

    你能解释一下为什么会这样吗? 我应该使用哪种解决方案?我很困惑。

        3
  •  -1
  •   Rekiem Ulises Xandrya    5 年前
      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);