gpt4 book ai didi

c# - 不完整的视频流式传输到移动浏览器 - HTTP header

转载 作者:太空宇宙 更新时间:2023-11-03 23:07:24 24 4
gpt4 key购买 nike

我正在尝试使用 Nancy MVC 框架将 mp4(片段)视频流式传输到移动浏览器客户端。一切正常。附上代码。

事实是,视频将在流式传输的同时生成,因此流的长度会随着时间的推移而增加。 有人知道如何支持这种情况吗?

(我试图在“content-range”标题中提交长度,给出任意最大大小以包含整个视频大小,但无济于事......)

 /*called when /video is requested*/
Get["/video"] = _ =>
{
if (Request.Headers.Keys.Contains("Range"))
return Response.FromPartialStream(Request, File.OpenRead("../Page/video-fragmented.mp4"), "video/mp4");
else
/*from stream...*/
};

public static Response FromPartialStream(this IResponseFormatter f,
Request req, Stream stream,
string contentType)
{
const string BYTES_RANGE_HEADER = "Range";

if (req.Headers[BYTES_RANGE_HEADER].Count() != 1)
throw new NotSupportedException();

var rangeStr = req.Headers[BYTES_RANGE_HEADER].FirstOrDefault();
var range = rangeStr.Replace("bytes=", String.Empty)
.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => Int32.Parse(x))
.ToArray();

var start = (range.Length > 0) ? range[0] : 0;
var end = (range.Length > 1) ? range[1] : (int)(stream.Length - 1);

var res = new PartialStreamResponse(stream, start, end, contentType)
.WithHeader("Connection", "keep-alive")
.WithHeader("Accept-Ranges", "bytes")
.WithHeader("Content-Range", "bytes " + start + "-" + end + "/" + stream.Length)
.WithHeader("Content-Length", (end - start + 1).ToString());

Console.WriteLine("Requested range: {0}", rangeStr);
return res;
}

public class PartialStreamResponse : Response
{
Stream sourceStream = null;
int start, end;

public PartialStreamResponse(Stream sourceStream, int start, int end, string mimeType)
{
this.sourceStream = sourceStream;
this.start = start;
this.end = end;

Contents = populateRequest;
StatusCode = HttpStatusCode.PartialContent;
ContentType = mimeType;
}

private void populateRequest(Stream stream)
{
Console.WriteLine("Begin stream...");
sourceStream.CopyTo(stream, start, end);
Console.WriteLine("End stream");
}
}

编辑:提供此类文件也应该适用于移动浏览器(单个文件比需要分段的 HLS 或 DASH 更受欢迎)

最佳答案

至少 Chrome 和 Firefox 可以愉快地处理 200 OK 响应,而响应中没有 Content-RangeContent-Length header 。在我看来,如果请求范围具有有效的结束标记,您应该只回复 206 Partial Content,否则只需回复 200 OK 而没有内容长度并推送流。当然另一件事是如何处理实时生成的文件。我建议将 moov 部分放在一个单独的文件中,然后使用当前的 moof 生成第二个文件 - 这样新客户端最初会获得 moov (这应该是固定的),当数据被发送后,服务器将继续读取和提供 moof 文件,该文件将被刷新。同样为了避免 I/O 饥饿(服务器试图读取文件以及生成试图写入它的内容的任何东西)你可以至少有 2 个 moof 文件作为双缓冲区 - 一个是最后一个完成的片段和另一个是当前正在编写的片段。

这是一个请求/响应 header 的示例,一个在 Chrome 中运行的实时片段视频:

Chrome request/response headers

在我看来,206 Partial Content 响应对于静态视频内容比直播更有用,因为在那种情况下浏览器可以获得 moov 原子,解析所有大小和偏移量表以及在加载内容时提供搜索,这对于实时视频来说是不可能的。

关于c# - 不完整的视频流式传输到移动浏览器 - HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40698384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com