从ASP.NET中的Seek位置流式传输MP4视频

本文关键字:传输 MP4 视频 位置 ASP NET 中的 Seek | 更新日期: 2023-09-27 18:28:53

从查找位置流式传输mp4视频时遇到问题。它从一开始就正常播放。

第一个问题是当mp4视频通过jw播放器flash播放器进行流媒体播放时。当用户点击时间条开始从视频的任何其他部分流式传输mp4视频时,jw播放器将发送开始参数和时间信息,例如

http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71

所以jwplayer发送时间间隔从中寻找mp4流。

我正在使用以下代码将大约的时间间隔转换为字节,因为查找将通过字节开始。

 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流。

有人能帮我解决这个问题吗。

从ASP.NET中的Seek位置流式传输MP4视频

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

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

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

同意,不能只查找这样的mp4/m3u8文件。

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

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

更新

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

Muhammad,

我注意到您正在对内容标头进行大量的计算和操作。也许当你对它们进行所有计算时,会导致一个无效的标题,因为有多余的小数点(使其无效)或这些设置的其他问题。

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

  1. 使用相同的播放器等从一个网站运行一个带有流媒体的示例视频,然后在成功工作时使用工具查看标题。只是为了有一组比较基准的标头和有效的值格式。

  2. 运行您的应用程序并在设置好头之后跟踪它们,也许是这样的:如何在ASP.Net中转储响应头更好的是,安装"LiveHTTPHeaders"FireFox插件或类似的东西。

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

也许我在这里错过了什么,但我希望这能激发一些想法。

我不认为您可以直接查找这样的mp4文件。即使你有标题,你也需要找到一个I帧才能播放视频。您很可能为此使用了错误的API。

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