Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 从.NET Core将视频流到Safari_Asp.net Core_Safari_Video Streaming_Range Header - Fatal编程技术网

Asp.net core 从.NET Core将视频流到Safari

Asp.net core 从.NET Core将视频流到Safari,asp.net-core,safari,video-streaming,range-header,Asp.net Core,Safari,Video Streaming,Range Header,除Safari外,流媒体在所有浏览器中都能正常工作。正如我所知,请求应该支持范围标头 以下是我正在使用的代码: public async Task<FileStreamResult> GetVideoStream() { if (Request.Headers.ContainsKey("Range")) { Request.Headers.TryGetValue("Range",

除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);
        }
工作正常,仅将100字节保存到文件中

还尝试了控制静音播放的变体line preload=“metadata”type=“video/mp4”我认为要获得合法的“范围”响应,您需要返回状态代码“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);
        }
公共异步任务GetVideoStream() { if(Request.Headers.ContainsKey(“范围”)) { Request.Headers.TryGetValue(“范围”,超出变量范围); _httpClient.DefaultRequestHeaders.Add(“Range”,Range.ToString()); } var stream=wait_httpClient.GetStreamAsync(_url); HttpContext.Response.StatusCode=206; 返回文件(流,“视频/mp4”,真); }
最后,我能够强制Safari流媒体视频。需要设置“内容范围”标题:

公共异步任务GetVideoStream() { if(Request.Headers.ContainsKey(“范围”)) { _httpClient.DefaultRequestHeaders.Remove(“范围”); var headersResponse=wait_httpClient.GetAsync(_url,HttpCompletionOption.ResponseHeadersRead); Request.Headers.TryGetValue(“范围”,超出变量范围); if(headersResponse.issucessstatuscode&&headersResponse.Content.Headers.GetValues(“Content Length”).Any()) HttpContext.Response.Headers.Add(“内容范围“,$”{Range[0]。替换(“=”,”“)}/{HeaderResponse.Content.Headers.GetValues(“内容长度”).First()); _httpClient.DefaultRequestHeaders.Add(“Range”,Range.ToString()); } var stream=wait_httpClient.GetStreamAsync(_url); 返回文件(流,“视频/mp4”,真); }
谢谢,@foadabd!我尝试了返回206状态码的不同变体,但也没有结果。在这种特殊情况下,如果返回文件,那么如果请求中出现范围标头,则应返回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);
        }
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);
}