C# 从ASP.NET中的Seek位置流式传输MP4视频
我在从seek位置流式传输mp4视频时遇到问题。它从一开始就可以正常播放 第一个问题是当mp4视频通过jw播放器flash播放器进行流媒体传输时。当用户点击时间条开始从视频的任何其他部分流式传输mp4视频时,jw播放器将发送开始参数以及时间信息,例如C# 从ASP.NET中的Seek位置流式传输MP4视频,c#,asp.net,.net,video-streaming,mp4,C#,Asp.net,.net,Video Streaming,Mp4,我在从seek位置流式传输mp4视频时遇到问题。它从一开始就可以正常播放 第一个问题是当mp4视频通过jw播放器flash播放器进行流媒体传输时。当用户点击时间条开始从视频的任何其他部分流式传输mp4视频时,jw播放器将发送开始参数以及时间信息,例如 http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71 所以jwplayer发送时间间隔来寻找mp4流 我使用以下代码将大约时间间隔转换为字
http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71
所以jwplayer发送时间间隔来寻找mp4流
我使用以下代码将大约时间间隔转换为字节,因为seek将通过字节启动
double total_duration = Convert.ToDouble(context.Request.Params["d"]);
double startduration = Convert.ToDouble(context.Request.Params["start"]);
double length_sec = (double)size / total_duration; // total length per second
start = (long)(length_sec * startduration);
下面是我用来从seek位置开始流式处理的完整示例代码,例如53.71
private void ChunkDownload(string fullpath, HttpContext context)
{
long size, start, end, length, fp = 0;
using (StreamReader reader = new StreamReader(fullpath))
{
size = reader.BaseStream.Length;
start = 0;
end = size - 1;
length = size;
double total_duration = Convert.ToDouble(context.Request.Params["d"]);
double startduration = Convert.ToDouble(context.Request.Params["start"]);
double length_sec = (double)size / total_duration; // total length per second
start = (long)(length_sec * startduration);
context.Response.AddHeader("Accept-Ranges", "0-" + size);
long anotherStart = start;
long anotherEnd = end;
// End bytes can not be larger than $end.
anotherEnd = (anotherEnd > end) ? end : anotherEnd;
// Validate the requested range and return an error if it's not correct.
if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size)
{
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
throw new HttpException(416, "Requested Range Not Satisfiable");
}
start = anotherStart;
end = anotherEnd;
length = end - start + 1; // Calculate new content length
fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
context.Response.StatusCode = 206;
}
// Notify the client the byte range we'll be outputting
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
context.Response.AddHeader("Content-Length", length.ToString());
context.Response.WriteFile(fullpath, fp, length);
context.Response.End();
}
但它无法通过播放器或直接检查流url来识别有效的mp4流
有人能帮我解决这个问题吗。没有有效的内容类型定义。尝试将ContentType设置为视频/mp4 更新
虽然已定义内容类型,并且根据您的代码,http状态代码为206,但我建议您检查此页面:没有有效的内容类型定义。尝试将ContentType设置为视频/mp4 更新 虽然已定义内容类型,并且根据您的代码,http状态代码为206,但我建议您查看此页面:Muhammad 我注意到您正在对内容标题进行大量的计算和操作。也许当您对这些设置进行所有计算时,会导致由于额外的小数位数(使其无效)或这些设置的其他问题而导致标题无效 也就是说,我建议您执行以下操作:
也许我在这里遗漏了一些东西,但我希望这能激发一些想法。我不认为你可以仅仅寻找这样的mp4文件。
即使你有标题,你也需要寻找一个I帧,视频才能播放。您很可能为此使用了错误的API。我不认为您可以直接查找这样的mp4文件。
即使你有标题,你也需要寻找一个I帧,视频才能播放。您很可能为此使用了错误的API。同意,您不能只查找这样的mp4/m3u8文件
但我认为你找不到解决方案或解决办法,我们的iPhone开发团队中有资深iPhone开发人员和外部顾问进行试错,我们花费了大量资源,但问题仍然无法解决。同意,你不能只寻求类似的mp4/m3u8文件
但我认为你找不到解决方案或解决办法,我们的iPhone开发团队中有资深的iPhone开发人员和外部顾问进行试错,我们花费了很多资源,但问题仍然无法解决。谷歌搜索后,没有找到相关的API 如果问题无法解决,您可以检查解决方法
如果可能,请提供更多信息供进一步研究。谷歌搜索后,没有找到相关的API 如果问题无法解决,您可以检查解决方法
如果可能的话,请提供更多信息以供进一步研究。我不会对本文中的回复内容发表评论,但您肯定会遇到一个问题,那就是MP4解析。与MP3不同,您无法轻松地将时间偏移转换为这样的字节范围。您需要解析mp4moov元素,并根据您感兴趣的时间偏移量在相关轨迹中查找正确的块。它是这样的:moov->trak->mdia->minf->stbl->stts这个stts框将为您提供所需的时间映射示例 我不会在这篇文章中对回复内容发表评论,但你肯定会遇到一个问题,那就是MP4解析。与MP3不同,您无法轻松地将时间偏移转换为这样的字节范围。您需要解析mp4moov元素,并根据您感兴趣的时间偏移量在相关轨迹中查找正确的块。它是这样的:moov->trak->mdia->minf->stbl->stts这个stts框将为您提供所需的时间映射示例 视频流通常出现在flash播放器、html5和iphone上,但在寻找位置的情况下,它仅在flash播放器或html5上无法识别视频。视频流通常出现在flash播放器、html5和iphone上