Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标题包含接受范围时视频流出现问题_C#_Asp.net Mvc_Video Streaming - Fatal编程技术网

C# 标题包含接受范围时视频流出现问题

C# 标题包含接受范围时视频流出现问题,c#,asp.net-mvc,video-streaming,C#,Asp.net Mvc,Video Streaming,我正在尝试从带有accept范围的服务器流式传输视频,以允许用户在客户端视频播放器上更改位置 当accept ranges代码包含在客户端jwplayer中或仅在chrome中直接从url打开时,通常播放约15秒,并且在每个区块被新请求请求后,实际上在15秒后只通过方法一次,响应中或响应后连接断开。Flush无任何错误有时Flush会在大约10%的请求中获取错误代码0x800704CD或0x800703E3或0x80070016,然后是响应。IsClientConnected=false,因此方

我正在尝试从带有accept范围的服务器流式传输视频,以允许用户在客户端视频播放器上更改位置

当accept ranges代码包含在客户端jwplayer中或仅在chrome中直接从url打开时,通常播放约15秒,并且在每个区块被新请求请求后,实际上在15秒后只通过方法一次,响应中或响应后连接断开。Flush无任何错误有时Flush会在大约10%的请求中获取错误代码0x800704CD或0x800703E3或0x80070016,然后是响应。IsClientConnected=false,因此方法结束

客户机被要求提供范围,例如123456为空,没有指定范围的结束部分

我猜这是不正确的行为,可能是响应上的标题错误。。或者是正常的,客户端视频播放器正在为每个块创建新的请求?实际上,它占用了我电脑80%的CPU

问题只存在于流式视频和同时创建大量新请求时,在通常情况下,当下载文件时,例如建立断开的下载时,没有问题

当accept ranges代码丢失时,视频流中就没有问题了,所有服务器->客户端传输都处于while循环中,并且只有当用户断开连接方法结束时才进行传输

此解决方案正在ASP.NET MVC4下运行

当前使用的代码:

    public void Method()
    {
        string path = @"filePath.mp4";
        FileInfo file = new FileInfo(path);
        long fileLength = file.Length;

        byte[] buffer = new byte[64 * 1024];
        long dataToRead = fileLength;
        long startbyte = 0;
        long location = 0;
        long readLength = 0;

        Response.AddHeader("Accept-Ranges", "bytes");
        Response.ContentType = "video/mp4";

        if (!String.IsNullOrEmpty(Request.Headers["Range"]))
        {
            string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
            location = long.Parse(range[1]);
            if (location >= 0 && location <= fileLength)
            {
                Response.StatusCode = 206;
                Response.AddHeader("content-range", String.Format(" bytes {0}-{1}/{2}", location, fileLength - 1, fileLength));
                startbyte = location;
                dataToRead = fileLength - startbyte;
                Response.AppendHeader("content-length", dataToRead.ToString());
            }
        }
        else
        {
            Response.StatusCode = 200;
            Response.AddHeader("Content-Range", String.Format(" bytes {0}-{1}/{2}", 0, fileLength - 1, fileLength));
            Response.AppendHeader("content-length", fileLength.ToString());
        }

        try
        {
            using (Stream stream = System.IO.File.OpenRead(path))
            {
                if (startbyte > 0)
                {
                    stream.Seek(startbyte, SeekOrigin.Begin);
                }

                while (dataToRead > 0)
                {
                    if (Response.IsClientConnected)
                    {
                        readLength = stream.Read(buffer, 0, buffer.Length);

                        Response.OutputStream.Write(buffer, 0, (int)readLength);
                        Response.Flush();

                        dataToRead = dataToRead - readLength;
                    }
                    else
                    {
                        dataToRead = -1;
                    }
                }
            }
        }
        catch (EndOfStreamException endStream)
        {
            Log.Error(endStream.Message, endStream);
        }
        catch (TimeoutException timeout)
        {
            Log.Error(timeout.Message, timeout);
        }
        catch (Exception e)
        {
            Log.Error(e.Message, e);
        }
        finally
        {
            Response.End();
        }
    }

作为旁注:我有一个与WCF类似的解决方案,对于像123456 empty这样的请求,我从不返回超过4MB的数据。它与JWPlayer一起工作。感谢回复,由于某些原因JWPlayer无法指定范围的结束,您对客户端播放器初始化有任何特殊设置吗?我只有文件:url、图像:url、宽度和高度,或者您在响应的标题设置中有任何差异吗?我认为无论它是wcf还是asp.net都没有关系?每个请求4MB听起来不错。我认为您应该在内容范围标头中使用dataToRead。顺便说一句:我也回应了如果修改了自头。我修复了内容范围,从开始位置到结束位置或文件结尾应该有长度,我尝试在wcf中创建类似的应用程序,但行为仍然相同,最后我发现,这个问题更具体,它只有在Chrome firefox和opera中才能正常工作,并且只有一个3,3GB的文件被测试过,更小但也更大—8GB的文件没有任何问题