Asp.net core 从.NET Core将视频流到Safari
除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",
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);
}