gpt4 book ai didi

c# - 流式传输大型视频文件 .net

转载 作者:太空狗 更新时间:2023-10-29 22:22:56 24 4
gpt4 key购买 nike

我正在尝试从 HttpHandler 流式传输 Web 表单中的大文件。它似乎不起作用,因为它没有流式传输文件。相反,它会将文件读入内存,然后将其发送回客户端。我四处寻找解决方案,解决方案告诉我他们在做同样的事情时流式传输文件。我的解决方案是这样的:

using (Stream fileStream = File.OpenRead(path))
{
context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(360.0));
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.AppendHeader("Content-Type", "video/mp4");
context.Response.AppendHeader("content-length", file.Length);
byte[] buffer = new byte[1024];
while (true)
{
if (context.Response.IsClientConnected)
{
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
context.Response.OutputStream.Write(buffer, 0, bytesRead);
context.Response.Flush();
}
else
{
break;
}

}
context.Response.End();
}

如果我调试代码,小文件会发生什么情况,它将播放视频,但直到它到达 context.Respond.End() 行。但对于大文件,这将不起作用,因为它将整个文件存储在内存中,这会带来问题。

最佳答案

我有一个类似的问题,视频必须在播放前完全下载。

我看得出来你想流式传输视频,更具体地说。你必须小心编码(确保它是可流式传输的),不要只依赖扩展名,因为创建文件的人可能会以一种奇怪的方式构建视频,但 99% 的时间你应该要好。我用 mediainfo .在您的情况下应该是 H.264。

它还取决于浏览器和您用来流式传输的内容(后端代码除外)。就我而言,我使用了 Chrome/Html5 和 .webm (VP8/Ogg Vorbis)。它适用于超过 1G 的文件。没有测试大于 4G...

我用于下载视频的代码:

    public void Video(string folder, string name) {
string filepath = Server.MapPath(String.Format("{0}{1}", HttpUtility.UrlDecode(folder), name));
string filename = name;

System.IO.Stream iStream = null;
byte[] buffer = new Byte[4096];
int length;
long dataToRead;

try {
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);


// Total bytes to read:
dataToRead = iStream.Length;

Response.AddHeader("Accept-Ranges", "bytes");
Response.ContentType = MimeType.GetMIMEType(name);

int startbyte = 0;

if (!String.IsNullOrEmpty(Request.Headers["Range"])) {
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startbyte = Int32.Parse(range[1]);
iStream.Seek(startbyte, SeekOrigin.Begin);

Response.StatusCode = 206;
Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", startbyte, dataToRead - 1, dataToRead));
}

while (dataToRead > 0) {
// Verify that the client is connected.
if (Response.IsClientConnected) {
// Read the data in buffer.
length = iStream.Read(buffer, 0, buffer.Length);

// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, buffer.Length);
// Flush the data to the HTML output.
Response.Flush();

buffer = new Byte[buffer.Length];
dataToRead = dataToRead - buffer.Length;
} else {
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
} catch (Exception ex) {
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
} finally {
if (iStream != null) {
//Close the file.
iStream.Close();
}
Response.Close();
}
}

确保您的响应 header 包含您需要的一切。

关于c# - 流式传输大型视频文件 .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862782/

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