4

流媒体在除 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 字节保存到文件中。

还尝试了各种控制静音的 playinline preload="metadata"type="video/mp4"

4

2 回答 2

3

我认为对于合法的“范围”响应,您需要返回状态代码“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);
        }
于 2020-07-12T13:36:33.500 回答
1

最后,我能够强制 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);
}
于 2020-07-14T06:35:49.987 回答