从 .NET Core 将视频流式传输到 Safari
Stream video to Safari from .NET Core
流式传输在除 Safari 之外的所有浏览器中都能正常运行。据我所知请求应该支持范围 header.
这是我正在使用的代码:
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 字节保存到文件中。
还尝试了 控制静音播放的变体在线预加载="metadata" 和 type="video/mp4"
我认为对于合法的“范围”响应,您需要 return 状态代码“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);
}
终于,我能够强制 Safari 流式传输视频了。要求设置 "Content-Range" header:
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);
}
流式传输在除 Safari 之外的所有浏览器中都能正常运行。据我所知请求应该支持范围 header.
这是我正在使用的代码:
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 字节保存到文件中。
还尝试了 控制静音播放的变体在线预加载="metadata" 和 type="video/mp4"
我认为对于合法的“范围”响应,您需要 return 状态代码“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);
}
终于,我能够强制 Safari 流式传输视频了。要求设置 "Content-Range" header:
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);
}