gpt4 book ai didi

HTML5 视频 - ashx 处理程序 - 寻求

转载 作者:行者123 更新时间:2023-12-04 02:06:46 28 4
gpt4 key购买 nike

我正在尝试使用 ashx 处理程序作为 HTML5 视频源。我可以做到这一点,但我无法在已经缓冲的视频上进一步前进。

我可以在使用标准 MP4 源的网络选项卡上看到向前搜索会创建另一个请求,但使用处理程序时它不会。

部分视频超过 1 GB。

到目前为止,这是我必须让视频正常工作的条件:

public void ProcessRequest(HttpContext context)
{
context.Response.Buffer = false;
context.Response.ContentType = "video/mp4";
FileInfo file = new FileInfo(path);
int len = (int)file.Length, bytes;
context.Response.AppendHeader("content-length", len.ToString());
byte[] buffer = new byte[1024];
Stream outStream = context.Response.OutputStream;
using (Stream stream = File.OpenRead(path))
{
while (len > 0 && (bytes = stream.Read(buffer, 0, buffer.Length)) > 0)
{
outStream.Write(buffer, 0, bytes);
len -= bytes;
}
}
}

摘自 Marck Gravells 后 Best way to stream files in ASP.NET :

<video id="video-player" class="video-js vjs-default-skin" controls
preload="auto" poster="MY_VIDEO_POSTER.jpg"
data-setup="{}">
<source src="/Handlers/VideoHandler.ashx" type='video/mp4'>
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>

使用 video.js,但如果我直接在浏览器中调用处理程序,也会发生同样的情况。

我该如何解决这个问题?我很可能遗漏了一些简单的东西。

更新

进一步查看后,我现在知道我需要“Accept-Ranges”。

我现在有

context.Response.ContentType = "video/mp4";

var request = HttpContext.Current.Request;
FileInfo file = new FileInfo(filePath);
var responseLength = (int)file.Length;
var buffer = new byte[1024];
var startIndex = 0;

if (request.Headers["Range"] != null)
{
var match = Regex.Match(request.Headers["Range"], @"bytes=(\d*)-(\d*)");
startIndex = Parse<int>(match.Groups[1].Value);
responseLength = (Parse<int?>(match.Groups[2].Value) + 1 ?? responseLength) - startIndex;
context.Response.StatusCode = (int)HttpStatusCode.PartialContent;
context.Response.Headers["Content-Range"] = "bytes " + startIndex + "-" + (startIndex + responseLength - 1) + "/" + responseLength;
}

context.Response.Headers["Accept-Ranges"] = "bytes";
context.Response.Headers["Content-Length"] = responseLength.ToString();
context.Response.Cache.SetCacheability(HttpCacheability.Public);

context.Response.Buffer = false;

Supporting resumable HTTP-downloads through an ASHX handler? 的帮助下, 但现在写给我错误的问题

HttpException was unhandled by user code The remote host closed the connection. The error code is 0x800704CD.

我试过:

using (Stream stream = File.OpenRead(filePath))
{

stream.Seek(startIndex, SeekOrigin.Begin);
while ((responseLength - startIndex) > 0 && (bytes = stream.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, bytes);
responseLength -= bytes;
}
}

using (Stream stream = File.OpenRead(filePath))
{
stream.Seek(startIndex, SeekOrigin.Begin);
int bufferLength = buffer.Length, bytesRead;
while (responseLength > bufferLength && (bytesRead = stream.Read(buffer, 0, bufferLength)) > 0)
{
response.OutputStream.Write(buffer, 0, bytesRead);
responseLength -= bytesRead;
}
while (responseLength > 0 && (bytesRead = stream.Read(buffer, 0, responseLength)) > 0)
{
response.OutputStream.Write(buffer, 0, bytesRead);
responseLength -= bytesRead;
}
}

我该如何解决这个问题?

最佳答案

最后一个错误是由 Chrome 造成的。

以下在 Firefox 中运行良好。

如果有人知道 Chrome 取消连接的原因,请分享。

    public void ProcessRequest(HttpContext context)
{
context.Response.AddHeader("content-disposition", "filename=" + Path.GetFileName(filePath));
context.Response.ContentType = "video/mp4";

var request = HttpContext.Current.Request;
FileInfo file = new FileInfo(filePath);
var responseLength = (int)file.Length;
var buffer = new byte[512];
var startIndex = 0;

if (request.Headers["Range"] != null )
{
var match = Regex.Match(request.Headers["Range"], @"bytes=(\d*)-(\d*)");
startIndex = Parse<int>(match.Groups[1].Value);
responseLength = (Parse<int?>(match.Groups[2].Value) + 1 ?? responseLength) - startIndex;
context.Response.StatusCode = (int)HttpStatusCode.PartialContent;
context.Response.Headers["Content-Range"] = "bytes " + startIndex + "-" + (startIndex + responseLength - 1) + "/" + responseLength;
}

context.Response.Headers["Accept-Ranges"] = "bytes";
context.Response.Headers["Content-Length"] = responseLength.ToString();
context.Response.Cache.SetCacheability(HttpCacheability.Public);

context.Response.BufferOutput = false;
FileStream fileStram = new FileStream(filePath, FileMode.Open, FileAccess.Read);
using (fileStram)
{
fileStram.Seek(startIndex, SeekOrigin.Begin);
int bytesRead = fileStram.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
context.Response.OutputStream.Write(buffer, 0, bytesRead);
bytesRead = fileStram.Read(buffer, 0, buffer.Length);
}
}
}

public static T Parse<T>(object value)
{
// Convert value to string to allow conversion from types like float to int
// converter.IsValid only works since .NET4 but still returns invalid values for a few cases like NULL for Unit and not respecting locale for date validation
try { return (T)System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString()); }
catch (Exception) { return default(T); }
}

关于HTML5 视频 - ashx 处理程序 - 寻求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374998/

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