【问题标题】:Stream video to Safari from .NET Core从 .NET Core 将视频流式传输到 Safari
【发布时间】:2020-09-20 13:41:33
【问题描述】:

流媒体在除 Safari 之外的所有浏览器中都能正常工作。据我所知,请求应该支持范围标头。

这是我正在使用的代码:

    public async Task<FileStreamResult> GetVideoStream()
        {
            if (Request.Headers.ContainsKey("Range"))
            {
                Request.Headers.TryGetValue("Range", out var range);
                _httpClient.DefaultRequestHeaders.Add("Range", range.ToString());
            }

            var stream = await _httpClient.GetStreamAsync(_url);

            return File(stream, "video/mp4", true);
        }

请求:

curl --range 0-99 https://localhost:44312/GetVideoStream -o D:\test

运行良好,文件只保存了 100 字节。

也尝试了 controls muted playinline preload="metadata"type="video/mp4"

的变体

【问题讨论】:

    标签: asp.net-core safari video-streaming range-header


    【解决方案1】:

    我认为对于合法的“范围”响应,您需要返回状态代码“206 部分内容”

    我们试试吧:

    public async Task<FileStreamResult> GetVideoStream()
            {
                if (Request.Headers.ContainsKey("Range"))
                {
                    Request.Headers.TryGetValue("Range", out var range);
                    _httpClient.DefaultRequestHeaders.Add("Range", range.ToString());
                }
    
                var stream = await _httpClient.GetStreamAsync(_url);
    
               HttpContext.Response.StatusCode = 206;
    
                return File(stream, "video/mp4", true);
            }
    

    【讨论】:

    • 谢谢你,@foadabd!我尝试了返回 206 状态码的不同变体,但也没有结果。在这种特殊情况下,如果返回 File,它应该返回 206,以防 Range 标头出现在请求中
    【解决方案2】:

    最后,我能够强制 Safari 流式传输视频。需要设置“Content-Range”标头:

    public async Task<FileStreamResult> GetVideoStream()
    {
      if (Request.Headers.ContainsKey("Range"))
      {
          _httpClient.DefaultRequestHeaders.Remove("Range");
          var headersResponse = await _httpClient.GetAsync(_url, HttpCompletionOption.ResponseHeadersRead);
    
          Request.Headers.TryGetValue("Range", out var range);
    
          if (headersResponse.IsSuccessStatusCode && headersResponse.Content.Headers.GetValues("Content-Length").Any())
              HttpContext.Response.Headers.Add("Content-Range", $"{range[0].Replace("=", " ")}/{headersResponse.Content.Headers.GetValues("Content-Length").First()}");
    
          _httpClient.DefaultRequestHeaders.Add("Range", range.ToString());
      }
    
      var stream = await _httpClient.GetStreamAsync(_url);
    
      return File(stream, "video/mp4", true);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 2012-08-23
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多