从ASP.NET中的Seek位置流式传输MP4video

从搜索位置流式传输mp4video时我遇到了问题。 从一开始就正确播放。

第一个问题是mp4video通过jw播放器flash播放器流式传输。 当用户点击时间栏从video的任何其他部分开始流式传输mp4video时,jw播放器将发送开始参数以及时间信息,例如

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); 

这是我用来从搜索位置开始流式传输的完整示例代码,例如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流。

任何人都可以帮我解决这个问题。

谷歌搜索后,没有找到相关的API。

如果无法修复问题,您可以检查解决方法。

如果可能,请提供更多信息以供进一步研究。

同意,你不能只是寻找像这样的mp4 / m3u8文件。

但我认为你找不到解决方案或解决方法,我们有高级iPhone开发人员和我的iPhone开发团队的外部顾问进行试错,我们花了这么多资源但问题仍然无法解决。

没有有效的内容类型定义。 尝试将ContentType设置为video / mp4。

UPDATE

虽然内容类型已定义,但根据您的代码,http状态代码为206,我建议您查看此页面: 206 Partial Content

穆罕默德,

我注意到你正在做很多计算和操作内容标题。 也许当你对它们进行所有数学计算时,它会导致标题由于额外的小数位(使其无效)或其他问题导致无效。

意思是,我建议你做以下事情:

  1. 使用相同的播放器等从站点运行带有流的示例video,然后使用工具在成功运行时查看标题。 只需要有一组基线和有效值格式进行比较。

  2. 运行您的应用程序并在设置它们之后跟踪标题,可能是这样的: 如何在ASP.Net中转储响应标头更好的是,安装“Live HTTP Headers”FireFox插件或类似的东西。

比较工作的标题集与您的标题。 你在设定的价值观中看到了什么奇怪的东西吗? 是否可能是内容范围/长度/等。 以某种方式抵消或无效? 只是寻找一致性,一个小错误可能很容易打破整个请求。

也许我在这里遗漏了一些东西,但我希望这能引发一些想法。

我不认为你可以像这样寻找一个mp4文件。 即使你有标题,你也需要寻找一个I帧来让video可以播放。 您很可能使用了错误的API。

我不会评论这篇文章中的响应内容,但你肯定有一个问题是MP4解析。 与MP3不同,你不能轻易地将时间偏移转换为像这样的字节范围。 你需要解析mp4 moov元素并根据你感兴趣的时间偏移在相关轨道中查找正确的块。它是这样的:moov-> trak-> mdia-> minf-> stbl-> stts stts框将为您提供所需的时间映射样本。