【问题标题】:PushStreamContent in asp.net core - video start playing only when whole file is bufferedasp.net 核心中的 PushStreamContent - 仅在缓冲整个文件时才开始播放视频
【发布时间】:2020-11-18 09:44:58
【问题描述】:

我对 asp.net 核心中的 PushStreamContent 有疑问。 它在网站上显示视频,但我的问题是它会缓冲整个文件,然后在我的目标是缓冲其中的一小部分并在网站上播放时播放它。我有的代码:

我在浏览器中播放视频的端点

public IActionResult Play(string file)
        {            
            var fileName = "C:\\repo\\trailer1.mp4";
            var video = new VideoStream(fileName);

            var response = 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;
        }

我有 VideoStreamClass 来帮助显示视频

    public class VideoStream
    {
        private readonly string _filename;

        public VideoStream(string filename)
        {
            _filename = @"C:\\repo\\trailer1.mp4";
        }
        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);
                        await outputStream.FlushAsync();
                        length -= bytesRead;
                    }
                }
            }
            catch (Exception)
            { return; }
            finally
            {
                outputStream.Dispose();
            }
        }
    }
And here is my VideoOutputFormatter added to bootstraper
    public class VideoOutputFormatter : IOutputFormatter
    {
        public bool CanWriteResult(OutputFormatterCanWriteContext context)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));

            if (context.Object is PushStreamContent)
                return true;

            return false;
        }

        public async Task WriteAsync(OutputFormatterWriteContext context)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));

            using (var stream = ((PushStreamContent)context.Object))
            {
                var response = context.HttpContext.Response;
                if (context.ContentType != null)
                {
                    response.ContentType = context.ContentType.ToString();
                }

                await stream.CopyToAsync(response.Body);
            }
        }
    }

我尝试将属性添加到控制器“UseBufferedOutputStream”和“UseBufferedInputStream”设置为false,但这仍然对我有用

【问题讨论】:

    标签: asp.net-core .net-core webapi


    【解决方案1】:

    ObjectResult 用于保存内存中的对象作为响应。如果您想返回现有文件,那么PhysicalFileResult 可能是您的最佳选择。

    如果您对PushStreamContent 感兴趣,我相信您使用的是HttpClient,而不是ASP.NET。如果你想要一个 PushStreamContent 等价物,我有一个 FileCallbackResult that would work once it's updated for the latest .NET Core

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多