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

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流 我使用以下代码将大约时间间隔转换为字

我在从seek位置流式传输mp4视频时遇到问题。它从一开始就可以正常播放

第一个问题是当mp4视频通过jw播放器flash播放器进行流媒体传输时。当用户点击时间条开始从视频的任何其他部分流式传输mp4视频时,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);
下面是我用来从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

我注意到您正在对内容标题进行大量的计算和操作。也许当您对这些设置进行所有计算时,会导致由于额外的小数位数(使其无效)或这些设置的其他问题而导致标题无效

也就是说,我建议您执行以下操作:

  • 使用同一播放机等从站点运行流式播放的示例视频,然后在其成功运行时使用工具查看标题。只是为了有一组基本的标题和有效的值格式来进行比较

  • 在设置标题后运行应用程序并跟踪标题,可能如下所示: 更好的是,安装“livehttpheaders”FireFox插件或类似的东西

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

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

    穆罕默德

    我注意到您正在对内容标题进行大量的计算和操作。也许当您对这些设置进行所有计算时,会导致由于额外的小数位数(使其无效)或这些设置的其他问题而导致标题无效

    也就是说,我建议您执行以下操作:

  • 使用同一播放机等从站点运行流式播放的示例视频,然后在其成功运行时使用工具查看标题。只是为了有一组基本的标题和有效的值格式来进行比较

  • 在设置标题后运行应用程序并跟踪标题,可能如下所示: 更好的是,安装“livehttpheaders”FireFox插件或类似的东西

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


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

    我不认为你可以仅仅寻找这样的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上