使用ASP.NET的渐进式Mp4流媒体
本文关键字:Mp4 流媒体 渐进式 ASP NET 使用 | 更新日期: 2023-09-27 18:27:53
我在使用asp.net脚本从任何部分或部分流式传输mp4视频时遇到问题。当您从一开始就流式传输mp4视频时,脚本运行良好,但如果您想选择任何起点,则无法流式传输。
我正在使用的示例脚本
if (filename.EndsWith(".mp4") && filename.Length > 2)
{
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
// Sample logic to calculate approx length based on starting time.
if (context.Request.Params["starttime"] != null && context.Request.Params["d"] != null)
{
double total_duration = Convert.ToDouble(context.Request.Params["d"]);
double startduration = Convert.ToDouble(context.Request.Params["starttime"]);
double length_sec = (double)fs.Length / total_duration; // total length per second
seekpos = (long)(length_sec * startduration);
}
if (seekpos==0)
{
position = 0;
length = Convert.ToInt32(fs.Length);
}
else
{
position = Convert.ToInt32(seekpos);
length = Convert.ToInt32(fs.Length - position);
}
// Add HTTP header stuff: cache, content type and length
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.Now);
context.Response.AppendHeader("Content-Type", "video/mp4");
context.Response.AppendHeader("Content-Length", length.ToString());
if (position > 0)
{
fs.Position = position;
}
// Read buffer and write stream to the response stream
const int buffersize = 16384;
byte[] buffer = new byte[buffersize];
int count = fs.Read(buffer, 0, buffersize);
while (count > 0)
{
if (context.Response.IsClientConnected)
{
context.Response.OutputStream.Write(buffer,0, count);
context.Response.Flush();
count = fs.Read(buffer, 0, buffersize);
}
else
{
count = -1;
}
}
fs.Close();
}
我认为问题出在以下行,如果我删除它,视频仍然可以播放,但从一开始如果(位置>0){fs。Position=位置;}如果寻道位置>0 ,可能会有类似flv流中用于跟踪寻道位置的起始mp4标头,因为无法识别流
有人能帮我吗。
谨致问候。
您将Content-Length设置为文件长度,但只发送部分文件。
此外,我不认为你可以这样划分视频,我认为你必须将文件位置设置为I帧的开头,这意味着以某种方式解析mp4文件,找到离你想要的时间最近的I帧,并将文件位置设为该字节,然后从那里开始流式传输。