ASP.Net Core Web Api 中的异步视频流不起作用

Posted

技术标签:

【中文标题】ASP.Net Core Web Api 中的异步视频流不起作用【英文标题】:Async video streaming in ASP.Net Core Web Api is not working 【发布时间】:2017-06-01 14:13:46 【问题描述】:

我之前使用过http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/ 这种技术,非常适合异步视频流。

但对于 ASP.NET Core,这种方式无法按预期工作。

按视频流类为:

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();
        
    

对于视频流请求,我有以下操作:

    [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;
    

由于默认情况下 Asp.Net Core 没有用于视频/mp4 的内置媒体格式化程序,因此我创建了以下自定义媒体格式化程序

 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  ???
    

并将以下行添加到 Startup.cs

 services.AddMvc(options =>
        
              options.OutputFormatters.Add(new VideoOutputFormatter());
        );

它实际上调用了我的自定义格式化程序。 我不知道如何为视频/mp4 实现这个自定义媒体格式化程序。 任何人都可以帮助我吗?

【问题讨论】:

嗨,Nurlan,您找到在 asp.net core 上进行视频流传输的解决方案了吗? 季杰勋,是的,经过一番努力我终于做到了 添加 villecoder 的 VideoOutputFormatter 代码也不起作用。你能和我分享你的工作代码示例吗?电子邮件:R.Ceyhun2011@gmail.com 【参考方案1】:

查看 Asp.NET Core 的源代码确实帮助我找到了这个问题的答案。他们有一个StreamOutputFormatter 类,它非常接近您想要使用的内容。我只需要修改它来寻找PushStreamContent,它就像一个魅力。

这是我完整的 VideoOutputFormatter:

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);
        
    

与其将HttpResponseMessage 包装在控制器中的ObjectResult 中,不如将PushStreamContent 对象推入ObjectResult。您仍然需要在ObjectResult 上设置MediaTypeHeaderValue

【讨论】:

感谢分享,但是我在net core中找不到PushStreamContent,请问您有样品吗? @Soren 不幸的是,我也找不到解决方案,最终只能通过像 nginx 这样的反向代理来提供视频。 你有解决办法吗?我无法获取您在此处发布的内容。我需要音频流。

以上是关于ASP.Net Core Web Api 中的异步视频流不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

Asp.net core web Api Fire and Forget BG task

ASP.Net Core Web API 中的安全用户操作

这是从 ASP.NET Core Web API 中的 EF Core 5 获得的啥样的响应 [关闭]

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL