C# 标题包含接受范围时视频流出现问题
我正在尝试从带有accept范围的服务器流式传输视频,以允许用户在客户端视频播放器上更改位置 当accept ranges代码包含在客户端jwplayer中或仅在chrome中直接从url打开时,通常播放约15秒,并且在每个区块被新请求请求后,实际上在15秒后只通过方法一次,响应中或响应后连接断开。Flush无任何错误有时Flush会在大约10%的请求中获取错误代码0x800704CD或0x800703E3或0x80070016,然后是响应。IsClientConnected=false,因此方法结束 客户机被要求提供范围,例如123456为空,没有指定范围的结束部分 我猜这是不正确的行为,可能是响应上的标题错误。。或者是正常的,客户端视频播放器正在为每个块创建新的请求?实际上,它占用了我电脑80%的CPU 问题只存在于流式视频和同时创建大量新请求时,在通常情况下,当下载文件时,例如建立断开的下载时,没有问题 当accept ranges代码丢失时,视频流中就没有问题了,所有服务器->客户端传输都处于while循环中,并且只有当用户断开连接方法结束时才进行传输 此解决方案正在ASP.NET MVC4下运行 当前使用的代码:C# 标题包含接受范围时视频流出现问题,c#,asp.net-mvc,video-streaming,C#,Asp.net Mvc,Video Streaming,我正在尝试从带有accept范围的服务器流式传输视频,以允许用户在客户端视频播放器上更改位置 当accept ranges代码包含在客户端jwplayer中或仅在chrome中直接从url打开时,通常播放约15秒,并且在每个区块被新请求请求后,实际上在15秒后只通过方法一次,响应中或响应后连接断开。Flush无任何错误有时Flush会在大约10%的请求中获取错误代码0x800704CD或0x800703E3或0x80070016,然后是响应。IsClientConnected=false,因此方
public void Method()
{
string path = @"filePath.mp4";
FileInfo file = new FileInfo(path);
long fileLength = file.Length;
byte[] buffer = new byte[64 * 1024];
long dataToRead = fileLength;
long startbyte = 0;
long location = 0;
long readLength = 0;
Response.AddHeader("Accept-Ranges", "bytes");
Response.ContentType = "video/mp4";
if (!String.IsNullOrEmpty(Request.Headers["Range"]))
{
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
location = long.Parse(range[1]);
if (location >= 0 && location <= fileLength)
{
Response.StatusCode = 206;
Response.AddHeader("content-range", String.Format(" bytes {0}-{1}/{2}", location, fileLength - 1, fileLength));
startbyte = location;
dataToRead = fileLength - startbyte;
Response.AppendHeader("content-length", dataToRead.ToString());
}
}
else
{
Response.StatusCode = 200;
Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", 0, fileLength - 1, fileLength));
Response.AppendHeader("content-length", fileLength.ToString());
}
try
{
using (Stream stream = System.IO.File.OpenRead(path))
{
if (startbyte > 0)
{
stream.Seek(startbyte, SeekOrigin.Begin);
}
while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
readLength = stream.Read(buffer, 0, buffer.Length);
Response.OutputStream.Write(buffer, 0, (int)readLength);
Response.Flush();
dataToRead = dataToRead - readLength;
}
else
{
dataToRead = -1;
}
}
}
}
catch (EndOfStreamException endStream)
{
Log.Error(endStream.Message, endStream);
}
catch (TimeoutException timeout)
{
Log.Error(timeout.Message, timeout);
}
catch (Exception e)
{
Log.Error(e.Message, e);
}
finally
{
Response.End();
}
}
作为旁注:我有一个与WCF类似的解决方案,对于像123456 empty这样的请求,我从不返回超过4MB的数据。它与JWPlayer一起工作。感谢回复,由于某些原因JWPlayer无法指定范围的结束,您对客户端播放器初始化有任何特殊设置吗?我只有文件:url、图像:url、宽度和高度,或者您在响应的标题设置中有任何差异吗?我认为无论它是wcf还是asp.net都没有关系?每个请求4MB听起来不错。我认为您应该在内容范围标头中使用dataToRead。顺便说一句:我也回应了如果修改了自头。我修复了内容范围,从开始位置到结束位置或文件结尾应该有长度,我尝试在wcf中创建类似的应用程序,但行为仍然相同,最后我发现,这个问题更具体,它只有在Chrome firefox和opera中才能正常工作,并且只有一个3,3GB的文件被测试过,更小但也更大—8GB的文件没有任何问题